Mercurial > hg > dmlib
annotate src/dmstring.c @ 2490:18ec4c092108
Fix dm_strncasecmp() edge case.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 28 Apr 2020 18:38:38 +0300 |
parents | 63dd0a611586 |
children | fcaf2db0cd05 |
rev | line source |
---|---|
0 | 1 #include "dmlib.h" |
2 #include <stdarg.h> | |
3 | |
813 | 4 |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
5 /* Compare two strings ignoring case [strcasecmp, strncasecmp] |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
6 */ |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
7 int dm_strcasecmp(const char *haystack, const char *needle) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
8 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
9 const char *s1 = haystack, *s2 = needle; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
10 assert(haystack != NULL); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
11 assert(needle != NULL); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
12 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
13 if (haystack == needle) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
14 return 0; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
15 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
16 while (*s1 && *s2) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
17 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
18 int k = tolower(*s1) - tolower(*s2); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
19 if (k != 0) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
20 return k; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
21 s1++; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
22 s2++; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
23 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
24 |
2465
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
25 return tolower(*s1) - tolower(*s2); |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
26 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
27 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
28 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
29 int dm_strncasecmp(const char *haystack, const char *needle, size_t n) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
30 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
31 const char *s1 = haystack, *s2 = needle; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
32 assert(haystack != NULL); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
33 assert(needle != NULL); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
34 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
35 if (haystack == needle) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
36 return 0; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
37 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
38 while (n > 0 && *s1 && *s2) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
39 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
40 int k = tolower(*s1) - tolower(*s2); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
41 if (k != 0) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
42 return k; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
43 s1++; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
44 s2++; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
45 n--; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
46 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
47 |
2490
18ec4c092108
Fix dm_strncasecmp() edge case.
Matti Hamalainen <ccr@tnsp.org>
parents:
2465
diff
changeset
|
48 return (n == 0) ? 0 : tolower(*s1) - tolower(*s2); |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
49 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
50 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
51 |
817 | 52 /* Check if end of the given string str matches needle |
53 * case-insensitively, return pointer to start of the match, | |
54 * if found, NULL otherwise. | |
55 */ | |
816 | 56 char *dm_strrcasecmp(char *str, const char *needle) |
57 { | |
58 if (str == NULL || needle == NULL) | |
59 return NULL; | |
2465
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
60 else |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
61 { |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
62 const size_t |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
63 slen = strlen(str), |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
64 nlen = strlen(needle); |
1102
e06abfde6c39
Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
836
diff
changeset
|
65 |
2465
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
66 if (slen < nlen) |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
67 return NULL; |
816 | 68 |
2465
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
69 if (dm_strcasecmp(str + slen - nlen, needle) == 0) |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
70 return str + slen - nlen; |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
71 else |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
72 return NULL; |
63dd0a611586
Sync string handling fixes from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
2079
diff
changeset
|
73 } |
816 | 74 } |
75 | |
76 | |
744
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
77 /* Implementation of strdup() with a NULL check |
0 | 78 */ |
79 char *dm_strdup(const char *s) | |
80 { | |
81 char *res; | |
82 if (s == NULL) | |
83 return NULL; | |
84 | |
85 if ((res = dmMalloc(strlen(s) + 1)) == NULL) | |
86 return NULL; | |
87 | |
88 strcpy(res, s); | |
89 return res; | |
90 } | |
91 | |
92 | |
744
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
93 /* Implementation of strndup() with NULL check |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
94 */ |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
95 char *dm_strndup(const char *str, const size_t n) |
744
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
96 { |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
97 char *res; |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
98 if (str == NULL) |
744
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
99 return NULL; |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
100 |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
101 size_t len = strlen(str); |
744
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
102 if (len > n) |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
103 len = n; |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
104 |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
105 if ((res = dmMalloc(len + 1)) == NULL) |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
106 return NULL; |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
107 |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
108 memcpy(res, str, len); |
744
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
109 res[len] = 0; |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
110 |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
111 return res; |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
112 } |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
113 |
2726d91e3409
Add implementation of dm_strndup().
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
114 |
2027
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
115 /* Like strdup, but trims whitespace from the string according to specified flags. |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
116 * See DM_TRIM_* in dmlib.h. If the resulting string would be empty (length 0), |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
117 * NULL is returned. |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
118 */ |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
119 static char * dm_strdup_trim_do(const char *src, size_t len, const int flags) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
120 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
121 char *res; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
122 size_t start, end; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
123 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
124 if (len == 0) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
125 return NULL; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
126 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
127 // Trim start: find first non-whitespace character |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
128 if (flags & DM_TRIM_START) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
129 for (start = 0; start < len && isspace(src[start]); start++); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
130 else |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
131 start = 0; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
132 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
133 // Trim end: find last non-whitespace character |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
134 if (flags & DM_TRIM_END) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
135 for (end = len - 1; end > start && isspace(src[end]); end--); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
136 else |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
137 end = len; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
138 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
139 // Allocate memory for result |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
140 if (src[end] == 0 || isspace(src[end])) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
141 return NULL; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
142 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
143 len = end - start + 1; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
144 if ((res = dmMalloc(len + 1)) == NULL) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
145 return NULL; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
146 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
147 memcpy(res, src + start, len); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
148 res[len] = 0; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
149 return res; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
150 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
151 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
152 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
153 char *dm_strdup_trim(const char *src, const int flags) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
154 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
155 if (src == NULL) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
156 return NULL; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
157 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
158 return dm_strdup_trim_do(src, strlen(src), flags); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
159 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
160 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
161 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
162 char *dm_strndup_trim(const char *src, const size_t n, const int flags) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
163 { |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
164 size_t len; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
165 if (src == NULL || n == 0) |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
166 return NULL; |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
167 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
168 for (len = 0; len < n && src[len]; len++); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
169 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
170 return dm_strdup_trim_do(src, len, flags); |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
171 } |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
172 |
750a7e125546
Add in several string helper functions from th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
1884
diff
changeset
|
173 |
0 | 174 /* Simulate a sprintf() that allocates memory |
175 */ | |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
176 char *dm_strdup_vprintf_len(const char *fmt, va_list args, int *len) |
0 | 177 { |
178 int size = 64; | |
836 | 179 char *buf, *tmp; |
0 | 180 |
181 if ((buf = dmMalloc(size)) == NULL) | |
182 return NULL; | |
183 | |
184 while (1) | |
185 { | |
186 va_list ap; | |
187 va_copy(ap, args); | |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
188 *len = vsnprintf(buf, size, fmt, ap); |
0 | 189 va_end(ap); |
190 | |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
191 if (*len > -1 && *len < size) |
0 | 192 return buf; |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
193 if (*len > -1) |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
194 size = *len + 1; |
0 | 195 else |
196 size *= 2; | |
197 | |
836 | 198 if ((tmp = dmRealloc(buf, size)) == NULL) |
199 { | |
200 dmFree(buf); | |
0 | 201 return NULL; |
836 | 202 } |
203 else | |
204 buf = tmp; | |
0 | 205 } |
206 } | |
207 | |
208 | |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
209 char *dm_strdup_vprintf(const char *fmt, va_list args) |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
210 { |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
211 int len; |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
212 return dm_strdup_vprintf_len(fmt, args, &len); |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
213 } |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
214 |
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
215 |
0 | 216 char *dm_strdup_printf(const char *fmt, ...) |
217 { | |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
218 int len; |
0 | 219 char *res; |
220 va_list ap; | |
221 | |
222 va_start(ap, fmt); | |
1884
47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
Matti Hamalainen <ccr@tnsp.org>
parents:
1102
diff
changeset
|
223 res = dm_strdup_vprintf_len(fmt, ap, &len); |
0 | 224 va_end(ap); |
225 | |
226 return res; | |
227 } |