Mercurial > hg > th-libs
annotate th_string.c @ 744:4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
allocated string buffer, instead of void.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 14 Dec 2022 22:58:12 +0200 |
parents | 31bc1ed07cf5 |
children | 600a3c08747f |
rev | line source |
---|---|
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
1 /* |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
2 * Miscellaneous string-handling related utility-functions |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
3 * Programmed and designed by Matti 'ccr' Hamalainen |
726 | 4 * (C) Copyright 2002-2022 Tecnic Software productions (TNSP) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
5 * |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
6 * Please read file 'COPYING' for information on license and distribution. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
7 */ |
49
598609fb49b0
Change how "config.h" is included, etc.
Matti Hamalainen <ccr@tnsp.org>
parents:
44
diff
changeset
|
8 #include "th_util.h" |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
9 #include "th_string.h" |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
10 |
531
f43c961cc85d
Move bulk of the printf() implementation into a separate file th_printf.c from th_string.c
Matti Hamalainen <ccr@tnsp.org>
parents:
529
diff
changeset
|
11 // Include printf implementation |
f43c961cc85d
Move bulk of the printf() implementation into a separate file th_printf.c from th_string.c
Matti Hamalainen <ccr@tnsp.org>
parents:
529
diff
changeset
|
12 #include "th_printf.c" |
f43c961cc85d
Move bulk of the printf() implementation into a separate file th_printf.c from th_string.c
Matti Hamalainen <ccr@tnsp.org>
parents:
529
diff
changeset
|
13 |
80 | 14 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
15 /** |
687 | 16 * Implementation of strchr() for th_char_t. |
702 | 17 * @param[in] src string to find @p valid from |
687 | 18 * @returns pointer to the match position, NULL if no match found |
19 */ | |
702 | 20 th_char_t *th_strchr(const th_char_t *str, const th_char_t valid) |
687 | 21 { |
702 | 22 for (th_char_t *ch = (th_char_t *) str; *ch; ch++) |
687 | 23 { |
702 | 24 if (*ch == valid) |
25 return ch; | |
687 | 26 } |
27 return NULL; | |
28 } | |
29 | |
30 | |
31 /** | |
701 | 32 * Implementation of strpbrk() for th_char_t. |
33 * @param[in] src string to find any th_char_t in @p valid from | |
34 * @returns pointer to the match position, NULL if no match found | |
35 */ | |
36 th_char_t *th_strpbrk(const th_char_t *str, const th_char_t *valid) | |
37 { | |
702 | 38 for (th_char_t *ch = (th_char_t *) str; *ch; ch++) |
701 | 39 { |
702 | 40 for (const th_char_t *cmp = valid; *cmp; cmp++) |
701 | 41 { |
702 | 42 if (*ch == *cmp) |
43 return ch; | |
701 | 44 } |
45 } | |
46 return NULL; | |
47 } | |
48 | |
49 | |
50 /** | |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
51 * Implementation of strdup() with a @c NULL check. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
52 * @param[in] src string to create a copy of |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
53 * @returns copy of the given string, or @c NULL if @p src was @c NULL or memory could not be allocated. |
8 | 54 */ |
663 | 55 th_char_t *th_strdup(const th_char_t *src) |
8 | 56 { |
663 | 57 th_char_t *res; |
522 | 58 size_t len; |
59 | |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
60 if (src == NULL) |
10 | 61 return NULL; |
44 | 62 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
63 len = th_strlen(src); |
665
4932188c9101
Oops, missed one case of * sizeof(th_char_t).
Matti Hamalainen <ccr@tnsp.org>
parents:
663
diff
changeset
|
64 if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) |
10 | 65 return NULL; |
44 | 66 |
665
4932188c9101
Oops, missed one case of * sizeof(th_char_t).
Matti Hamalainen <ccr@tnsp.org>
parents:
663
diff
changeset
|
67 memcpy(res, src, (len + 1) * sizeof(th_char_t)); |
10 | 68 return res; |
8 | 69 } |
70 | |
71 | |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
72 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
73 * Implementation of strndup() with @c NULL check. Copies up to @p n |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
74 * characters from the source. A NUL terminator is always added, |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
75 * unless @p src was @c NULL or memory could not be allocated, in which |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
76 * case @c NULL pointer is returned. |
659 | 77 * |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
78 * @param[in] src string pointer to be copied from |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
79 * @param[in] n maximum number of characters to copy |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
80 * @returns the resulting string or @c NULL pointer |
81 | 81 */ |
663 | 82 th_char_t *th_strndup(const th_char_t *src, const size_t n) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
83 { |
663 | 84 th_char_t *res; |
81 | 85 size_t len; |
79 | 86 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
87 if (src == NULL) |
81 | 88 return NULL; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
89 |
714
ec6a3790a91b
Do not use th_strlen() in th_strndup(), as the string might not have a
Matti Hamalainen <ccr@tnsp.org>
parents:
707
diff
changeset
|
90 for (len = 0; len < n && src[len]; len++); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
91 |
663 | 92 if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) |
81 | 93 return NULL; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
94 |
663 | 95 memcpy(res, src, len * sizeof(th_char_t)); |
81 | 96 res[len] = 0; |
97 | |
98 return res; | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
99 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
100 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
101 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
102 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
103 * Helper function for th_strdup_trim() and friends. Copies @p len characters from |
630 | 104 * given string, and trims whitespace from it according to specified @p flags. |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
105 * See TH_TRIM_* in th_string.h. If @p len or the resulting trimmed string would |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
106 * be empty (length 0), no copy is allocated and a @c NULL pointer is returned. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
107 * @param[in] src source string (does not need to be NUL terminated, as length must be specified) |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
108 * @param[in] len length of the source string, or desired number of characters to copy at maximum |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
109 * @param[in] flags trimming flags, see TH_TRIM_* in th_string.h |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
110 * @returns the resulting string or @c NULL pointer |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
111 */ |
663 | 112 static th_char_t * th_strdup_trim_do(const th_char_t *src, size_t len, const int flags) |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
113 { |
663 | 114 th_char_t *res; |
220
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
115 size_t start, end; |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
116 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
117 if (len == 0) |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
118 return NULL; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
119 |
174 | 120 // Trim start: find first non-whitespace character |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
121 if (flags & TH_TRIM_START) |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
122 for (start = 0; start < len && th_isspace(src[start]); start++); |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
123 else |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
124 start = 0; |
174 | 125 |
126 // Trim end: find last non-whitespace character | |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
127 if (flags & TH_TRIM_END) |
224
128c8cb80205
Fix th_str(n)dup_trim() functions. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
223
diff
changeset
|
128 for (end = len - 1; end > start && th_isspace(src[end]); end--); |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
129 else |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
130 end = len; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
131 |
174 | 132 // Allocate memory for result |
224
128c8cb80205
Fix th_str(n)dup_trim() functions. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
223
diff
changeset
|
133 if (src[end] == 0 || th_isspace(src[end])) |
222
723a69185102
Fix th_str{n}dup_trim() functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
221
diff
changeset
|
134 return NULL; |
723a69185102
Fix th_str{n}dup_trim() functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
221
diff
changeset
|
135 |
224
128c8cb80205
Fix th_str(n)dup_trim() functions. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
223
diff
changeset
|
136 len = end - start + 1; |
663 | 137 if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
138 return NULL; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
139 |
663 | 140 memcpy(res, src + start, len * sizeof(th_char_t)); |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
141 res[len] = 0; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
142 return res; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
143 } |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
144 |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
145 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
146 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
147 * Create copy of the given string, but trim the result according to specified @p flags. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
148 * See TH_TRIM_* in th_string.h. If length the resulting trimmed string would |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
149 * be empty (0), no copy is allocated and a NULL pointer is returned. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
150 * @param[in] src source string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
151 * @param[in] flags trimming flags, see TH_TRIM_* in th_string.h |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
152 * @returns the resulting string or @c NULL pointer |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
153 */ |
663 | 154 th_char_t *th_strdup_trim(const th_char_t *src, const int flags) |
220
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
155 { |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
156 if (src == NULL) |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
157 return NULL; |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
158 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
159 return th_strdup_trim_do(src, th_strlen(src), flags); |
220
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
160 } |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
161 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
162 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
163 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
164 * Create copy of the given string @p src, up to @p n characters (or less, if the string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
165 * is shorter.) The result is trimmed according to specified @p flags. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
166 * See TH_TRIM_* in th_string.h. If @p n or the resulting trimmed string would |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
167 * be empty (length 0), no copy is allocated and a NULL pointer is returned. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
168 * @param[in] src source string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
169 * @param[in] n maximum number of characters to copy from the source string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
170 * @param[in] flags trimming flags, see TH_TRIM_* in th_string.h |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
171 * @returns the resulting string or @c NULL pointer |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
172 */ |
663 | 173 th_char_t *th_strndup_trim(const th_char_t *src, const size_t n, const int flags) |
220
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
174 { |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
175 size_t len; |
659 | 176 |
220
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
177 if (src == NULL || n == 0) |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
178 return NULL; |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
179 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
180 for (len = 0; len < n && src[len]; len++); |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
181 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
182 return th_strdup_trim_do(src, len, flags); |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
183 } |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
184 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
185 |
663 | 186 th_char_t *th_strndup_no0(const th_char_t *src, const size_t len) |
487
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
187 { |
663 | 188 th_char_t *res; |
488
8917c39ef6c5
Oops. Forgot to declare a variable.
Matti Hamalainen <ccr@tnsp.org>
parents:
487
diff
changeset
|
189 |
663 | 190 if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) |
487
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
191 return NULL; |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
192 |
663 | 193 memcpy(res, src, len * sizeof(th_char_t)); |
487
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
194 res[len] = 0; |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
195 |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
196 return res; |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
197 } |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
198 |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
199 |
663 | 200 th_char_t *th_strndup_no0_trim(const th_char_t *src, const size_t len, const int flags) |
487
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
201 { |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
202 return th_strdup_trim_do(src, len, flags); |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
203 } |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
204 |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
205 |
239
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
206 #ifdef TH_USE_INTERNAL_SPRINTF |
663 | 207 static int th_pbuf_vputch(th_vprintf_ctx *ctx, const th_char_t ch) |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
208 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
209 if (ctx->pos < ctx->size) |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
210 ctx->buf[ctx->pos] = ch; |
283 | 211 |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
212 ctx->pos++; |
279
15e2ee6c7bfc
Add th_printf_ctx.ipos and use it for return values. It's a hack. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
278
diff
changeset
|
213 ctx->ipos++; |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
214 return ch; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
215 } |
239
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
216 #endif |
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
217 |
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
218 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
219 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
220 * Wrapper for either libc vsnprintf() or th-libs internal |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
221 * vsnprintf() implementation, as determined by a compile-time define. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
222 * @param[out] buf pointer to buffer to print to |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
223 * @param[in] size available space in the buffer in bytes |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
224 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
225 * @param[in] ap a va_list variable arguments list structure |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
226 */ |
663 | 227 int th_vsnprintf(th_char_t *buf, size_t size, const th_char_t *fmt, va_list ap) |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
228 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
229 #ifdef TH_USE_INTERNAL_SPRINTF |
252 | 230 int ret; |
374
1d8ae82304ec
Rename s/th_printf_ctx/th_vprintf_cts/g.
Matti Hamalainen <ccr@tnsp.org>
parents:
373
diff
changeset
|
231 th_vprintf_ctx ctx; |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
232 ctx.buf = buf; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
233 ctx.size = size; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
234 ctx.pos = 0; |
281
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
235 ctx.ipos = 0; |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
236 |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
237 ret = th_vprintf_do(&ctx, th_pbuf_vputch, fmt, ap); |
252 | 238 |
239 if (ctx.pos < size) | |
240 buf[ctx.pos] = 0; | |
241 else | |
242 if (size > 0) | |
243 buf[size - 1] = 0; | |
244 | |
245 return ret; | |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
246 #else |
237
c55ebc438243
Oops, s/vsnpintf/vsnprintf/.
Matti Hamalainen <ccr@tnsp.org>
parents:
236
diff
changeset
|
247 return vsnprintf(buf, size, fmt, ap); |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
248 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
249 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
250 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
251 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
252 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
253 * Wrapper for either libc snprintf() or th-libs internal |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
254 * snprintf() implementation, as determined by a compile-time define. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
255 * @param[out] buf pointer to buffer to print to |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
256 * @param[in] size available space in the buffer in bytes |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
257 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
258 * @param[in] ... variable arguments |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
259 */ |
663 | 260 int th_snprintf(th_char_t *buf, size_t size, const th_char_t *fmt, ...) |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
261 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
262 int n; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
263 va_list ap; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
264 va_start(ap, fmt); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
265 #ifdef TH_USE_INTERNAL_SPRINTF |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
266 n = th_vsnprintf(buf, size, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
267 #else |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
268 n = vsnprintf(buf, size, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
269 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
270 va_end(ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
271 return n; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
272 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
273 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
274 |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
275 #ifdef TH_USE_INTERNAL_SPRINTF |
663 | 276 static int th_stdio_vputch(th_vprintf_ctx *ctx, const th_char_t ch) |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
277 { |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
278 ctx->pos++; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
279 ctx->ipos++; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
280 return fputc(ch, (FILE *) ctx->data); |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
281 } |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
282 #endif |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
283 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
284 |
663 | 285 int th_vfprintf(FILE *fh, const th_char_t *fmt, va_list ap) |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
286 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
287 #ifdef TH_USE_INTERNAL_SPRINTF |
374
1d8ae82304ec
Rename s/th_printf_ctx/th_vprintf_cts/g.
Matti Hamalainen <ccr@tnsp.org>
parents:
373
diff
changeset
|
288 th_vprintf_ctx ctx; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
289 ctx.data = (void *) fh; |
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
290 ctx.pos = 0; |
281
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
291 ctx.ipos = 0; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
292 |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
293 return th_vprintf_do(&ctx, th_stdio_vputch, fmt, ap); |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
294 #else |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
295 return vfprintf(fh, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
296 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
297 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
298 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
299 |
663 | 300 int th_fprintf(FILE *fh, const th_char_t *fmt, ...) |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
301 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
302 int ret; |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
303 va_list ap; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
304 #ifdef TH_USE_INTERNAL_SPRINTF |
374
1d8ae82304ec
Rename s/th_printf_ctx/th_vprintf_cts/g.
Matti Hamalainen <ccr@tnsp.org>
parents:
373
diff
changeset
|
305 th_vprintf_ctx ctx; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
306 #endif |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
307 |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
308 va_start(ap, fmt); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
309 #ifdef TH_USE_INTERNAL_SPRINTF |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
310 ctx.data = (void *) fh; |
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
311 ctx.pos = 0; |
281
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
312 ctx.ipos = 0; |
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
313 |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
314 ret = th_vprintf_do(&ctx, th_stdio_vputch, fmt, ap); |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
315 #else |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
316 ret = fprintf(fh, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
317 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
318 va_end(ap); |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
319 |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
320 return ret; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
321 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
322 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
323 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
324 /* Simulate a sprintf() that allocates memory |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
325 */ |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
326 #ifdef TH_USE_INTERNAL_SPRINTF |
663 | 327 static int th_pbuf_alloc_vputch1(th_vprintf_ctx *ctx, const th_char_t ch) |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
328 { |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
329 ctx->pos++; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
330 return ch; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
331 } |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
332 |
663 | 333 static int th_pbuf_alloc_vputch2(th_vprintf_ctx *ctx, const th_char_t ch) |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
334 { |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
335 ctx->buf[ctx->pos++] = ch; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
336 return ch; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
337 } |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
338 #endif |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
339 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
340 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
341 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
342 * Combination of vsprintf() and strdup. Automatically allocates memory |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
343 * for the resulting string. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
344 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
345 * @param[in] args variable arguments list structure |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
346 * @returns the resulting string or @c NULL pointer in case of error |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
347 */ |
663 | 348 th_char_t *th_strdup_vprintf(const th_char_t *fmt, va_list args) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
349 { |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
350 #ifdef TH_USE_INTERNAL_SPRINTF |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
351 // Using internal printf() implementation |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
352 th_vprintf_ctx ctx; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
353 va_list ap; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
354 |
659 | 355 // Get the size of the output |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
356 va_copy(ap, args); |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
357 ctx.pos = 0; |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
358 th_vprintf_do(&ctx, th_pbuf_alloc_vputch1, fmt, ap); |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
359 va_end(ap); |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
360 |
659 | 361 // Allocate memory for it |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
362 ctx.size = ctx.pos + 1; |
663 | 363 if ((ctx.buf = th_malloc(ctx.size * sizeof(th_char_t))) == NULL) |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
364 return NULL; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
365 |
659 | 366 // Print the final result into the buffer |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
367 va_copy(ap, args); |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
368 ctx.pos = 0; |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
369 th_vprintf_do(&ctx, th_pbuf_alloc_vputch2, fmt, ap); |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
370 va_end(ap); |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
371 ctx.buf[ctx.pos] = 0; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
372 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
373 return ctx.buf; |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
374 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
375 #else |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
376 // Using libc vsnprintf() |
133 | 377 int size = 64; |
663 | 378 th_char_t *buf, *tmp; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
379 |
260 | 380 if (fmt == NULL) |
381 return NULL; | |
382 | |
663 | 383 if ((buf = th_malloc(size * sizeof(th_char_t))) == NULL) |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
384 return NULL; |
44 | 385 |
39 | 386 while (1) |
387 { | |
37
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
388 int n; |
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
389 va_list ap; |
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
390 va_copy(ap, args); |
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
391 n = vsnprintf(buf, size, fmt, ap); |
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
392 va_end(ap); |
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
393 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
394 if (n > -1 && n < size) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
395 return buf; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
396 if (n > -1) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
397 size = n + 1; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
398 else |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
399 size *= 2; |
37
3986b139bbbd
Fix th_strdup_vprintf(), another misuse of va_list without making a copy of it... :(
Matti Hamalainen <ccr@tnsp.org>
parents:
36
diff
changeset
|
400 |
663 | 401 if ((tmp = th_realloc(buf, size * sizeof(th_char_t))) == NULL) |
133 | 402 { |
403 th_free(buf); | |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
404 return NULL; |
133 | 405 } |
406 else | |
407 buf = tmp; | |
10 | 408 } |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
409 #endif |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
410 } |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
411 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
412 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
413 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
414 * Combination of sprintf() and strdup. Automatically allocates memory |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
415 * for the resulting string. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
416 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
417 * @param[in] ... optional printf arguments |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
418 * @returns the resulting string or @c NULL pointer in case of error |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
419 */ |
663 | 420 th_char_t *th_strdup_printf(const th_char_t *fmt, ...) |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
421 { |
663 | 422 th_char_t *res; |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
423 va_list ap; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
424 |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
425 va_start(ap, fmt); |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
426 res = th_strdup_vprintf(fmt, ap); |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
427 va_end(ap); |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
428 |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
429 return res; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
430 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
431 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
432 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
433 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
434 * A helper function that is given a pointer to a pointer of string, |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
435 * which will be automatically freed (if necessary) and replaced with |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
436 * a pointer to the newly created string. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
437 * @param[in,out] buf pointer to a char pointer/string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
438 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
439 * @param[in] args variable arguments list structure |
744
4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
Matti Hamalainen <ccr@tnsp.org>
parents:
735
diff
changeset
|
440 * @returns the resulting string or @c NULL pointer in case of error |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
441 */ |
744
4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
Matti Hamalainen <ccr@tnsp.org>
parents:
735
diff
changeset
|
442 th_char_t *th_pstr_vprintf(th_char_t **buf, const th_char_t *fmt, va_list ap) |
30
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
443 { |
663 | 444 th_char_t *tmp = th_strdup_vprintf(fmt, ap); |
30
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
445 th_free(*buf); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
446 *buf = tmp; |
744
4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
Matti Hamalainen <ccr@tnsp.org>
parents:
735
diff
changeset
|
447 return tmp; |
30
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
448 } |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
449 |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
450 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
451 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
452 * A helper function that is given a pointer to a pointer of string, |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
453 * which will be automatically freed (if necessary) and replaced with |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
454 * a pointer to the newly created string. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
455 * @param[in,out] buf pointer to a char pointer/string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
456 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
457 * @param[in] ... optional printf arguments |
744
4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
Matti Hamalainen <ccr@tnsp.org>
parents:
735
diff
changeset
|
458 * @returns the resulting string or @c NULL pointer in case of error |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
459 */ |
744
4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
Matti Hamalainen <ccr@tnsp.org>
parents:
735
diff
changeset
|
460 th_char_t *th_pstr_printf(th_char_t **buf, const th_char_t *fmt, ...) |
30
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
461 { |
663 | 462 th_char_t *tmp; |
30
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
463 va_list ap; |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
464 |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
465 va_start(ap, fmt); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
466 tmp = th_strdup_vprintf(fmt, ap); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
467 va_end(ap); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
468 |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
469 th_free(*buf); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
470 *buf = tmp; |
744
4181d43f91f9
Change th_pstr_printf()/th_pstr_vprintf() to return pointer to the newly
Matti Hamalainen <ccr@tnsp.org>
parents:
735
diff
changeset
|
471 return tmp; |
30
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
472 } |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
473 |
88 | 474 |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
475 /* Compare two strings ignoring case [strcasecmp, strncasecmp] |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
476 */ |
663 | 477 int th_strcasecmp(const th_char_t *haystack, const th_char_t *needle) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
478 { |
663 | 479 const th_char_t *s1 = haystack, *s2 = needle; |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
480 assert(haystack != NULL); |
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
481 assert(needle != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
482 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
483 if (haystack == needle) |
10 | 484 return 0; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
485 |
262
e459a28ee1be
Found some nasty bugs hiding in th_str{n}casecmp() functions via unit tests. Fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
486 while (*s1 && *s2) |
39 | 487 { |
262
e459a28ee1be
Found some nasty bugs hiding in th_str{n}casecmp() functions via unit tests. Fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
488 int k = th_tolower(*s1) - th_tolower(*s2); |
e459a28ee1be
Found some nasty bugs hiding in th_str{n}casecmp() functions via unit tests. Fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
489 if (k != 0) |
283 | 490 return k; |
10 | 491 s1++; |
492 s2++; | |
493 } | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
494 |
690
953e16582f25
Fix th_strcasecmp() and th_strncasecmp() for certain .. cases.
Matti Hamalainen <ccr@tnsp.org>
parents:
687
diff
changeset
|
495 return th_tolower(*s1) - th_tolower(*s2); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
496 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
497 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
498 |
663 | 499 int th_strncasecmp(const th_char_t *haystack, const th_char_t *needle, size_t n) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
500 { |
663 | 501 const th_char_t *s1 = haystack, *s2 = needle; |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
502 assert(haystack != NULL); |
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
503 assert(needle != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
504 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
505 if (haystack == needle) |
10 | 506 return 0; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
507 |
262
e459a28ee1be
Found some nasty bugs hiding in th_str{n}casecmp() functions via unit tests. Fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
508 while (n > 0 && *s1 && *s2) |
39 | 509 { |
262
e459a28ee1be
Found some nasty bugs hiding in th_str{n}casecmp() functions via unit tests. Fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
510 int k = th_tolower(*s1) - th_tolower(*s2); |
e459a28ee1be
Found some nasty bugs hiding in th_str{n}casecmp() functions via unit tests. Fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
511 if (k != 0) |
283 | 512 return k; |
10 | 513 s1++; |
514 s2++; | |
515 n--; | |
516 } | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
517 |
715
6f627f4f11db
Fix th_strncasecmp() edge case.
Matti Hamalainen <ccr@tnsp.org>
parents:
714
diff
changeset
|
518 return (n == 0) ? 0 : th_tolower(*s1) - th_tolower(*s2); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
519 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
520 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
521 |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
522 /* Check if end of the given string str matches needle |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
523 * case-insensitively, return pointer to start of the match, |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
524 * if found, NULL otherwise. |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
525 */ |
663 | 526 th_char_t *th_strrcasecmp(th_char_t *str, const th_char_t *needle) |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
527 { |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
528 if (str == NULL || needle == NULL) |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
529 return NULL; |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
530 else |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
531 { |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
532 const size_t |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
533 slen = th_strlen(str), |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
534 nlen = th_strlen(needle); |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
535 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
536 if (slen < nlen) |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
537 return NULL; |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
538 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
539 if (th_strcasecmp(str + slen - nlen, needle) == 0) |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
540 return str + slen - nlen; |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
541 else |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
542 return NULL; |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
543 } |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
544 } |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
545 |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
546 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
547 /* Copy a given string over in *pdst. |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
548 */ |
663 | 549 int th_pstr_cpy(th_char_t **pdst, const th_char_t *src) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
550 { |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
551 size_t slen; |
696
9bbacd72df3d
Allow src and dst to "overlap" for th_pstr_cpy().
Matti Hamalainen <ccr@tnsp.org>
parents:
690
diff
changeset
|
552 th_char_t *tmp; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
553 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
554 if (pdst == NULL || src == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
555 return THERR_NULLPTR; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
556 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
557 slen = th_strlen(src); |
696
9bbacd72df3d
Allow src and dst to "overlap" for th_pstr_cpy().
Matti Hamalainen <ccr@tnsp.org>
parents:
690
diff
changeset
|
558 if ((tmp = th_malloc((slen + 1) * sizeof(th_char_t))) == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
559 return THERR_MALLOC; |
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
560 |
696
9bbacd72df3d
Allow src and dst to "overlap" for th_pstr_cpy().
Matti Hamalainen <ccr@tnsp.org>
parents:
690
diff
changeset
|
561 memcpy(tmp, src, (slen + 1) * sizeof(th_char_t)); |
9bbacd72df3d
Allow src and dst to "overlap" for th_pstr_cpy().
Matti Hamalainen <ccr@tnsp.org>
parents:
690
diff
changeset
|
562 |
9bbacd72df3d
Allow src and dst to "overlap" for th_pstr_cpy().
Matti Hamalainen <ccr@tnsp.org>
parents:
690
diff
changeset
|
563 th_free(*pdst); |
9bbacd72df3d
Allow src and dst to "overlap" for th_pstr_cpy().
Matti Hamalainen <ccr@tnsp.org>
parents:
690
diff
changeset
|
564 *pdst = tmp; |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
565 |
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
566 return THERR_OK; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
567 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
568 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
569 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
570 /* Concatenates a given string into string pointed by *pdst. |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
571 */ |
663 | 572 int th_pstr_cat(th_char_t **pdst, const th_char_t *src) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
573 { |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
574 if (pdst == NULL || src == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
575 return THERR_NULLPTR; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
576 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
577 if (*pdst != NULL) |
39 | 578 { |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
579 size_t dlen = strlen(*pdst), slen = strlen(src); |
663 | 580 if ((*pdst = th_realloc(*pdst, (dlen + slen + 1) * sizeof(th_char_t))) == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
581 return THERR_MALLOC; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
582 |
663 | 583 memcpy((*pdst) + dlen, src, (slen + 1) * sizeof(th_char_t)); |
39 | 584 } |
585 else | |
586 { | |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
587 size_t slen = strlen(src); |
663 | 588 if ((*pdst = th_malloc((slen + 1) * sizeof(th_char_t))) == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
589 return THERR_MALLOC; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
590 |
663 | 591 memcpy(*pdst, src, (slen + 1) * sizeof(th_char_t)); |
10 | 592 } |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
593 |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
594 return THERR_OK; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
595 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
596 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
597 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
598 int th_split_string_elems(const th_char_t *str, th_strelems_t *ctx, const th_char_t *sep) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
599 { |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
600 size_t start = 0, end; |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
601 bool match = false; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
602 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
603 if (str == NULL || ctx == NULL || sep == NULL) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
604 return THERR_NULLPTR; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
605 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
606 ctx->elems = NULL; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
607 ctx->nelems = 0; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
608 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
609 do |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
610 { |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
611 // Split foremost str element out |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
612 match = false; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
613 for (end = start; str[end] != 0; end++) |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
614 { |
687 | 615 if (th_strchr(sep, str[end])) |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
616 { |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
617 match = true; |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
618 break; |
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
619 } |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
620 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
621 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
622 // If the element is there, create it |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
623 if (str[start] != 0 && end >= start) |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
624 { |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
625 th_char_t *elem = th_strndup(str + start, end - start); |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
626 if (elem == NULL) |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
627 return THERR_MALLOC; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
628 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
629 if ((ctx->elems = th_realloc(ctx->elems, sizeof(th_char_t **) * (ctx->nelems + 1))) == NULL) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
630 return THERR_MALLOC; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
631 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
632 ctx->elems[ctx->nelems] = elem; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
633 ctx->nelems++; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
634 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
635 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
636 start = end + 1; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
637 } while (match); |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
638 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
639 return THERR_OK; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
640 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
641 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
642 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
643 int th_split_string(const th_char_t *str, th_char_t ***elems, size_t *nelems, const th_char_t *sep) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
644 { |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
645 th_strelems_t ctx; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
646 int res; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
647 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
648 if (elems == NULL || nelems == NULL) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
649 return THERR_NULLPTR; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
650 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
651 if ((res = th_split_string_elems(str, &ctx, sep)) == THERR_OK) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
652 return res; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
653 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
654 *elems = ctx.elems; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
655 *nelems = ctx.nelems; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
656 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
657 return THERR_OK; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
658 } |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
659 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
660 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
661 int th_join_string_elems(th_char_t **str, const th_strelems_t *ctx, const th_char_t *sep) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
662 { |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
663 size_t len, n, offs, seplen, *elemlens; |
706
d289fae3c1a8
Oops, forgot to free elemlens in th_join_string_elems() in no-error case. Ugh.
Matti Hamalainen <ccr@tnsp.org>
parents:
702
diff
changeset
|
664 int res = THERR_OK; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
665 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
666 if (str == NULL || ctx == NULL || sep == NULL) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
667 return THERR_NULLPTR; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
668 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
669 if ((elemlens = th_malloc(ctx->nelems * sizeof(size_t))) == NULL) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
670 return THERR_MALLOC; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
671 |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
672 seplen = th_strlen(sep); |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
673 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
674 for (len = n = 0; n < ctx->nelems; n++) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
675 { |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
676 len += elemlens[n] = th_strlen(ctx->elems[n]); |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
677 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
678 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
679 len += 1 + n * seplen; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
680 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
681 if ((*str = th_malloc(len)) == NULL) |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
682 { |
706
d289fae3c1a8
Oops, forgot to free elemlens in th_join_string_elems() in no-error case. Ugh.
Matti Hamalainen <ccr@tnsp.org>
parents:
702
diff
changeset
|
683 res = THERR_MALLOC; |
d289fae3c1a8
Oops, forgot to free elemlens in th_join_string_elems() in no-error case. Ugh.
Matti Hamalainen <ccr@tnsp.org>
parents:
702
diff
changeset
|
684 goto out; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
685 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
686 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
687 for (offs = n = 0; n < ctx->nelems; n++) |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
688 { |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
689 if (n > 0) |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
690 { |
679
83a48de05fe9
Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined.
Matti Hamalainen <ccr@tnsp.org>
parents:
674
diff
changeset
|
691 memcpy((*str) + offs, sep, seplen * sizeof(th_char_t)); |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
692 offs += seplen; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
693 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
694 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
695 memcpy((*str) + offs, ctx->elems[n], elemlens[n] * sizeof(th_char_t)); |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
696 offs += elemlens[n]; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
697 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
698 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
699 (*str)[offs] = 0; |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
700 |
706
d289fae3c1a8
Oops, forgot to free elemlens in th_join_string_elems() in no-error case. Ugh.
Matti Hamalainen <ccr@tnsp.org>
parents:
702
diff
changeset
|
701 out: |
d289fae3c1a8
Oops, forgot to free elemlens in th_join_string_elems() in no-error case. Ugh.
Matti Hamalainen <ccr@tnsp.org>
parents:
702
diff
changeset
|
702 th_free(elemlens); |
707
57d30f49fe1e
Return the correct return value from th_join_string_elems().
Matti Hamalainen <ccr@tnsp.org>
parents:
706
diff
changeset
|
703 return res; |
674
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
704 } |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
705 |
dfabc7eef3dd
Add new functions th_split_string() and th_join_string().
Matti Hamalainen <ccr@tnsp.org>
parents:
665
diff
changeset
|
706 |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
707 int th_join_string(th_char_t **str, th_char_t **elems, const size_t nelems, const th_char_t *sep) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
708 { |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
709 th_strelems_t ctx; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
710 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
711 ctx.elems = elems; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
712 ctx.nelems = nelems; |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
713 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
714 return th_join_string_elems(str, &ctx, sep); |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
715 } |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
716 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
717 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
718 void th_strelems_free(th_strelems_t *ctx) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
719 { |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
720 if (ctx != NULL) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
721 { |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
722 for (size_t n = 0; n < ctx->nelems; n++) |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
723 { |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
724 th_free(ctx->elems[n]); |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
725 } |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
726 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
727 th_free(ctx->elems); |
683
d8738bfad0a8
Nullify the strelems when freed.
Matti Hamalainen <ccr@tnsp.org>
parents:
680
diff
changeset
|
728 ctx->elems = NULL; |
d8738bfad0a8
Nullify the strelems when freed.
Matti Hamalainen <ccr@tnsp.org>
parents:
680
diff
changeset
|
729 ctx->nelems = 0; |
680
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
730 } |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
731 } |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
732 |
39c82d877251
Add new th_strelems_t structure for and join/split functions using them to
Matti Hamalainen <ccr@tnsp.org>
parents:
679
diff
changeset
|
733 |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
734 /* Find next non-whitespace character in string. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
735 * Updates iPos into the position of such character and |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
736 * returns pointer to the string. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
737 */ |
663 | 738 const th_char_t *th_findnext(const th_char_t *str, size_t *pos) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
739 { |
10 | 740 assert(str != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
741 |
129 | 742 // Terminating NULL-character is not whitespace! |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
743 while (th_isspace(str[*pos])) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
744 (*pos)++; |
39 | 745 |
663 | 746 return str + *pos; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
747 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
748 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
749 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
750 /* Find next sep-character from string |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
751 */ |
663 | 752 const th_char_t *th_findsep(const th_char_t *str, size_t *pos, const th_char_t sep) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
753 { |
10 | 754 assert(str != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
755 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
756 while (str[*pos] && str[*pos] != sep) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
757 (*pos)++; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
758 |
663 | 759 return str + *pos; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
760 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
761 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
762 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
763 /* Find next sep- or whitespace from string |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
764 */ |
663 | 765 const th_char_t *th_findseporspace(const th_char_t *str, size_t *pos, const th_char_t sep) |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
766 { |
10 | 767 assert(str != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
768 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
769 while (!th_isspace(str[*pos]) && str[*pos] != sep) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
770 (*pos)++; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
771 |
663 | 772 return str + *pos; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
773 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
774 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
775 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
776 /* Compare a string to a pattern. Case-SENSITIVE version. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
777 * The matching pattern can consist of any normal characters plus |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
778 * wildcards ? and *. "?" matches any character and "*" matches |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
779 * any number of characters. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
780 */ |
593
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
781 #define TH_STRGLOB_FUNC th_strmatch |
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
782 #define TH_STRGLOB_COLLATE(px) (px) |
606
5ec903f366b5
Rename th_strmatch.c to th_strglob.c
Matti Hamalainen <ccr@tnsp.org>
parents:
593
diff
changeset
|
783 #include "th_strglob.c" |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
784 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
785 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
786 /* Compare a string to a pattern. Case-INSENSITIVE version. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
787 */ |
593
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
788 #define TH_STRGLOB_FUNC th_strcasematch |
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
789 #define TH_STRGLOB_COLLATE(px) th_tolower(px) |
606
5ec903f366b5
Rename th_strmatch.c to th_strglob.c
Matti Hamalainen <ccr@tnsp.org>
parents:
593
diff
changeset
|
790 #include "th_strglob.c" |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
791 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
792 |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
793 bool th_get_hex_triplet(const th_char_t *str, unsigned int *value) |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
794 { |
663 | 795 const th_char_t *p = str; |
497
ff3ebe22f6c5
Change int th_get_hex_triplet(const char *str) API to
Matti Hamalainen <ccr@tnsp.org>
parents:
488
diff
changeset
|
796 int len; |
ff3ebe22f6c5
Change int th_get_hex_triplet(const char *str) API to
Matti Hamalainen <ccr@tnsp.org>
parents:
488
diff
changeset
|
797 *value = 0; |
44 | 798 |
507
8bb0817210a0
Fix th_get_hex_triplet() some more ..
Matti Hamalainen <ccr@tnsp.org>
parents:
503
diff
changeset
|
799 for (len = 0; *p && len < 4 * 2; p++, len++) |
39 | 800 { |
801 if (*p >= '0' && *p <= '9') | |
802 { | |
503
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
803 (*value) <<= 4; |
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
804 (*value) |= (*p - '0'); |
39 | 805 } |
174 | 806 else |
807 if (*p >= 'A' && *p <= 'F') | |
39 | 808 { |
503
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
809 (*value) <<= 4; |
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
810 (*value) |= (*p - 'A') + 10; |
39 | 811 } |
174 | 812 else |
813 if (*p >= 'a' && *p <= 'f') | |
39 | 814 { |
503
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
815 (*value) <<= 4; |
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
816 (*value) |= (*p - 'a') + 10; |
39 | 817 } |
818 else | |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
819 return false; |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
820 } |
44 | 821 |
507
8bb0817210a0
Fix th_get_hex_triplet() some more ..
Matti Hamalainen <ccr@tnsp.org>
parents:
503
diff
changeset
|
822 return (len >= 3 * 2 && len <= 4 * 2); |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
823 } |
162
578d9298cc1e
Actually, move th_print_wrap() to th_string module.
Matti Hamalainen <ccr@tnsp.org>
parents:
144
diff
changeset
|
824 |
578d9298cc1e
Actually, move th_print_wrap() to th_string module.
Matti Hamalainen <ccr@tnsp.org>
parents:
144
diff
changeset
|
825 |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
826 bool th_get_boolean(const th_char_t *str, bool *value) |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
827 { |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
828 if (!th_strcasecmp(str, "yes") || |
169
a06a87b771ce
Add on/off to valid boolean values.
Matti Hamalainen <ccr@tnsp.org>
parents:
167
diff
changeset
|
829 !th_strcasecmp(str, "on") || |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
830 !th_strcasecmp(str, "true") || |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
831 !th_strcasecmp(str, "1")) |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
832 { |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
833 *value = true; |
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
834 return true; |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
835 } |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
836 else |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
837 if (!th_strcasecmp(str, "no") || |
169
a06a87b771ce
Add on/off to valid boolean values.
Matti Hamalainen <ccr@tnsp.org>
parents:
167
diff
changeset
|
838 !th_strcasecmp(str, "off") || |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
839 !th_strcasecmp(str, "false") || |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
840 !th_strcasecmp(str, "0")) |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
841 { |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
842 *value = false; |
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
843 return true; |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
844 } |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
845 else |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
846 return false; |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
847 } |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
848 |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
849 |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
850 bool th_get_int(const th_char_t *str, unsigned int *value, bool *neg) |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
851 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
852 int ch; |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
853 bool hex = false; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
854 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
855 // Is the value negative? |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
856 if (*str == '-') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
857 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
858 if (neg == NULL) |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
859 return false; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
860 |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
861 *neg = true; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
862 str++; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
863 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
864 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
865 if (neg != NULL) |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
866 *neg = false; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
867 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
868 // Is it hexadecimal? |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
869 if (*str == '$') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
870 { |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
871 hex = true; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
872 str++; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
873 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
874 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
875 if (str[0] == '0' && str[1] == 'x') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
876 { |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
877 hex = true; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
878 str += 2; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
879 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
880 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
881 // Parse the value |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
882 *value = 0; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
883 if (hex) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
884 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
885 while ((ch = *str++)) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
886 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
887 if (ch >= '0' && ch <= '9') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
888 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
889 *value <<= 4; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
890 *value |= ch - '0'; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
891 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
892 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
893 if (ch >= 'A' && ch <= 'F') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
894 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
895 *value <<= 4; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
896 *value |= ch - 'A' + 10; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
897 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
898 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
899 if (ch >= 'a' && ch <= 'f') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
900 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
901 *value <<= 4; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
902 *value |= ch - 'a' + 10; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
903 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
904 else |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
905 return false; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
906 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
907 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
908 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
909 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
910 while ((ch = *str++)) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
911 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
912 if (ch >= '0' && ch <= '9') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
913 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
914 *value *= 10; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
915 *value += ch - '0'; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
916 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
917 else |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
918 return false; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
919 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
920 } |
735
31bc1ed07cf5
Renaming BOOL->bool and TRUE/FALSE to true/false, and using stdbool.h if available.
Matti Hamalainen <ccr@tnsp.org>
parents:
726
diff
changeset
|
921 return true; |
479
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
922 } |