1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <ctype.h>
17 #include "strops.h"
18
19 /* string to lower */
strlwc(char * str)20 void strlwc(char *str)
21 {
22 if (str == NULL) return;
23 while (*str != '\0') {
24 *str = (char)tolower(*str);
25 str++ ;
26 }
27 return;
28 }
29 /* trim head and tail spaces of string */
strtrim(char * str)30 size_t strtrim(char *str)
31 {
32 char *last = NULL;
33 char *dest = str;
34
35 if (str == NULL) return 0;
36
37 last = str + strlen(str);
38 while (isspace((int)*str) && *str) str++;
39 while (last > str) {
40 if (!isspace((int)*(last - 1))) break;
41 last--;
42 }
43 *last = (char)0;
44
45 memmove(dest, str, last - str + 1);
46 return last - str;
47 }
48 /* split string to list by given string */
strsplit(const char * str,const char * split_s)49 strlist *strsplit(const char *str, const char *split_s)
50 {
51 char *cur, *next;
52 if (!str) return NULL;
53
54 strlist *sl = strlist_alloc(0);
55 char *ss = ld_strdup(str);
56 if (!sl || !ss) {
57 strlist_free(sl);
58 __libc_free(ss);
59 return NULL;
60 }
61
62 cur = ss;
63 while (next = strstr(cur, split_s)) {
64 *next = 0;
65 strtrim(cur);
66 strlist_set(sl, cur);
67 cur = next + strlen(split_s);
68 }
69 strtrim(cur);
70 strlist_set(sl, cur);
71 __libc_free(ss);
72 return sl;
73 }
74
75 #define STR_DEFAULT_SIZE 16
76
strlist_alloc(size_t size)77 strlist *strlist_alloc(size_t size)
78 {
79 strlist *strs;
80 if (size < STR_DEFAULT_SIZE) size = STR_DEFAULT_SIZE ;
81
82 strs = (strlist *)__libc_calloc(1, sizeof *strs) ;
83
84 if (strs) {
85 strs->strs = (char **)__libc_calloc(size, sizeof *strs->strs);
86 if (strs->strs) {
87 strs->size = size;
88 } else {
89 __libc_free(strs);
90 strs = NULL;
91 }
92 }
93 return strs ;
94 }
95
strlist_realloc(strlist * strs)96 static void strlist_realloc(strlist *strs)
97 {
98 if (!strs) return;
99 size_t size = 2 * strs->size;
100 if (size) {
101 char **ss = (char **)__libc_realloc(strs->strs, size * (sizeof *strs->strs));
102 if (ss) {
103 strs->size = size;
104 strs->strs = ss;
105 }
106 }
107 return;
108 }
109
strlist_free(strlist * strs)110 void strlist_free(strlist *strs)
111 {
112 if (!strs) return;
113 for (size_t i = 0; i < strs->num; i++) {
114 __libc_free(strs->strs[i]);
115 }
116 __libc_free(strs->strs);
117 __libc_free(strs);
118 }
119
strlist_set(strlist * strs,const char * str)120 void strlist_set(strlist *strs, const char *str)
121 {
122 if (!strs || !str) return;
123 if (strs->num == strs->size) {
124 strlist_realloc(strs);
125 }
126 if (strs->num < strs->size) {
127 strs->strs[strs->num] = ld_strdup(str);
128 if (strs->strs[strs->num]) strs->num++;
129 }
130 }
131
ld_strdup(const char * s)132 char *ld_strdup(const char *s)
133 {
134 size_t l = strlen(s);
135 char *d = __libc_malloc(l + 1);
136 if (!d) return NULL;
137 return memcpy(d, s, l + 1);
138 }