Mercurial > hg > th-libs
annotate th_string.c @ 665:4932188c9101
Oops, missed one case of * sizeof(th_char_t).
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 27 Jan 2020 07:51:07 +0200 |
parents | 284d5b789b7c |
children | dfabc7eef3dd |
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 |
553 | 4 * (C) Copyright 2002-2020 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 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
16 * 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
|
17 * @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
|
18 * @returns copy of the given string, or @c NULL if @p src was @c NULL or memory could not be allocated. |
8 | 19 */ |
663 | 20 th_char_t *th_strdup(const th_char_t *src) |
8 | 21 { |
663 | 22 th_char_t *res; |
522 | 23 size_t len; |
24 | |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
25 if (src == NULL) |
10 | 26 return NULL; |
44 | 27 |
522 | 28 len = strlen(src); |
665
4932188c9101
Oops, missed one case of * sizeof(th_char_t).
Matti Hamalainen <ccr@tnsp.org>
parents:
663
diff
changeset
|
29 if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) |
10 | 30 return NULL; |
44 | 31 |
665
4932188c9101
Oops, missed one case of * sizeof(th_char_t).
Matti Hamalainen <ccr@tnsp.org>
parents:
663
diff
changeset
|
32 memcpy(res, src, (len + 1) * sizeof(th_char_t)); |
10 | 33 return res; |
8 | 34 } |
35 | |
36 | |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
37 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
38 * 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
|
39 * 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
|
40 * 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
|
41 * case @c NULL pointer is returned. |
659 | 42 * |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
43 * @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
|
44 * @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
|
45 * @returns the resulting string or @c NULL pointer |
81 | 46 */ |
663 | 47 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
|
48 { |
663 | 49 th_char_t *res; |
81 | 50 size_t len; |
79 | 51 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
52 if (src == NULL) |
81 | 53 return NULL; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
54 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
55 len = strlen(src); |
81 | 56 if (len > n) |
57 len = n; | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
58 |
663 | 59 if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) |
81 | 60 return NULL; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
61 |
663 | 62 memcpy(res, src, len * sizeof(th_char_t)); |
81 | 63 res[len] = 0; |
64 | |
65 return res; | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
66 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
67 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
68 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
69 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
70 * Helper function for th_strdup_trim() and friends. Copies @p len characters from |
630 | 71 * 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
|
72 * 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
|
73 * 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
|
74 * @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
|
75 * @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
|
76 * @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
|
77 * @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
|
78 */ |
663 | 79 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
|
80 { |
663 | 81 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
|
82 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
|
83 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
84 if (len == 0) |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
85 return NULL; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
86 |
174 | 87 // Trim start: find first non-whitespace character |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
88 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
|
89 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
|
90 else |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
91 start = 0; |
174 | 92 |
93 // Trim end: find last non-whitespace character | |
90
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
94 if (flags & TH_TRIM_END) |
224
128c8cb80205
Fix th_str(n)dup_trim() functions. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
223
diff
changeset
|
95 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
|
96 else |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
97 end = len; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
98 |
174 | 99 // Allocate memory for result |
224
128c8cb80205
Fix th_str(n)dup_trim() functions. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
223
diff
changeset
|
100 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
|
101 return NULL; |
723a69185102
Fix th_str{n}dup_trim() functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
221
diff
changeset
|
102 |
224
128c8cb80205
Fix th_str(n)dup_trim() functions. :S
Matti Hamalainen <ccr@tnsp.org>
parents:
223
diff
changeset
|
103 len = end - start + 1; |
663 | 104 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
|
105 return NULL; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
106 |
663 | 107 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
|
108 res[len] = 0; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
109 return res; |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
110 } |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
111 |
2b1f7f1ca8e4
Add new function th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
89
diff
changeset
|
112 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
113 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
114 * 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
|
115 * 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
|
116 * 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
|
117 * @param[in] src source string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
118 * @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
|
119 * @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
|
120 */ |
663 | 121 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
|
122 { |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
123 if (src == NULL) |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
124 return NULL; |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
125 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
126 return th_strdup_trim_do(src, strlen(src), flags); |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
127 } |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
128 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
129 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
130 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
131 * 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
|
132 * 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
|
133 * 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
|
134 * 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
|
135 * @param[in] src source string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
136 * @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
|
137 * @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
|
138 * @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
|
139 */ |
663 | 140 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
|
141 { |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
142 size_t len; |
659 | 143 |
220
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
144 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
|
145 return NULL; |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
146 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
147 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
|
148 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
149 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
|
150 } |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
151 |
099a1a156fd7
Implement th_strndup_trim() and factorize implementation of th_strdup_trim().
Matti Hamalainen <ccr@tnsp.org>
parents:
186
diff
changeset
|
152 |
663 | 153 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
|
154 { |
663 | 155 th_char_t *res; |
488
8917c39ef6c5
Oops. Forgot to declare a variable.
Matti Hamalainen <ccr@tnsp.org>
parents:
487
diff
changeset
|
156 |
663 | 157 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
|
158 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
|
159 |
663 | 160 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
|
161 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
|
162 |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
163 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
|
164 } |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
165 |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
166 |
663 | 167 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
|
168 { |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
169 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
|
170 } |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
171 |
702c64a6c570
Add new string helper functions th_strndup_no0() and th_strndup_no0_trim()
Matti Hamalainen <ccr@tnsp.org>
parents:
481
diff
changeset
|
172 |
239
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
173 #ifdef TH_USE_INTERNAL_SPRINTF |
663 | 174 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
|
175 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
176 if (ctx->pos < ctx->size) |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
177 ctx->buf[ctx->pos] = ch; |
283 | 178 |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
179 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
|
180 ctx->ipos++; |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
181 return ch; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
182 } |
239
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
183 #endif |
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
184 |
10f596441e75
Silence unused function warning when not using internal implementations.
Matti Hamalainen <ccr@tnsp.org>
parents:
238
diff
changeset
|
185 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
186 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
187 * 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
|
188 * 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
|
189 * @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
|
190 * @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
|
191 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
192 * @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
|
193 */ |
663 | 194 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
|
195 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
196 #ifdef TH_USE_INTERNAL_SPRINTF |
252 | 197 int ret; |
374
1d8ae82304ec
Rename s/th_printf_ctx/th_vprintf_cts/g.
Matti Hamalainen <ccr@tnsp.org>
parents:
373
diff
changeset
|
198 th_vprintf_ctx ctx; |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
199 ctx.buf = buf; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
200 ctx.size = size; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
201 ctx.pos = 0; |
281
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
202 ctx.ipos = 0; |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
203 |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
204 ret = th_vprintf_do(&ctx, th_pbuf_vputch, fmt, ap); |
252 | 205 |
206 if (ctx.pos < size) | |
207 buf[ctx.pos] = 0; | |
208 else | |
209 if (size > 0) | |
210 buf[size - 1] = 0; | |
211 | |
212 return ret; | |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
213 #else |
237
c55ebc438243
Oops, s/vsnpintf/vsnprintf/.
Matti Hamalainen <ccr@tnsp.org>
parents:
236
diff
changeset
|
214 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
|
215 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
216 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
217 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
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 snprintf() or th-libs internal |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
221 * 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
|
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] ... variable arguments |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
226 */ |
663 | 227 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
|
228 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
229 int n; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
230 va_list ap; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
231 va_start(ap, fmt); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
232 #ifdef TH_USE_INTERNAL_SPRINTF |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
233 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
|
234 #else |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
235 n = vsnprintf(buf, size, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
236 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
237 va_end(ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
238 return n; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
239 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
240 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
241 |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
242 #ifdef TH_USE_INTERNAL_SPRINTF |
663 | 243 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
|
244 { |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
245 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
|
246 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
|
247 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
|
248 } |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
249 #endif |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
250 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
251 |
663 | 252 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
|
253 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
254 #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
|
255 th_vprintf_ctx ctx; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
256 ctx.data = (void *) fh; |
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
257 ctx.pos = 0; |
281
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
258 ctx.ipos = 0; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
259 |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
260 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
|
261 #else |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
262 return vfprintf(fh, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
263 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
264 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
265 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
266 |
663 | 267 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
|
268 { |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
269 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
|
270 va_list ap; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
271 #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
|
272 th_vprintf_ctx ctx; |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
273 #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
|
274 |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
275 va_start(ap, fmt); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
276 #ifdef TH_USE_INTERNAL_SPRINTF |
251
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
277 ctx.data = (void *) fh; |
7b76108248e9
More work on printing functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
250
diff
changeset
|
278 ctx.pos = 0; |
281
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
279 ctx.ipos = 0; |
0c70dcfb6796
Remember to initialize th_printf_ctx.ipos to 0!
Matti Hamalainen <ccr@tnsp.org>
parents:
280
diff
changeset
|
280 |
568
2fbe42d957c4
Actually, partially revert the previous commit and unbreak the API. Leave
Matti Hamalainen <ccr@tnsp.org>
parents:
567
diff
changeset
|
281 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
|
282 #else |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
283 ret = fprintf(fh, fmt, ap); |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
284 #endif |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
285 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
|
286 |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
287 return ret; |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
288 } |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
289 |
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
290 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
291 /* Simulate a sprintf() that allocates memory |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
292 */ |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
293 #ifdef TH_USE_INTERNAL_SPRINTF |
663 | 294 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
|
295 { |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
296 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
|
297 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
|
298 } |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
299 |
663 | 300 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
|
301 { |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
302 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
|
303 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
|
304 } |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
305 #endif |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
306 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
307 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
308 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
309 * 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
|
310 * for the resulting string. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
311 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
312 * @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
|
313 * @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
|
314 */ |
663 | 315 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
|
316 { |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
317 #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
|
318 // 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
|
319 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
|
320 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
|
321 |
659 | 322 // 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
|
323 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
|
324 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
|
325 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
|
326 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
|
327 |
659 | 328 // 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
|
329 ctx.size = ctx.pos + 1; |
663 | 330 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
|
331 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
|
332 |
659 | 333 // 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
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 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
|
341 |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
342 #else |
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
343 // Using libc vsnprintf() |
133 | 344 int size = 64; |
663 | 345 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
|
346 |
260 | 347 if (fmt == NULL) |
348 return NULL; | |
349 | |
663 | 350 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
|
351 return NULL; |
44 | 352 |
39 | 353 while (1) |
354 { | |
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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
361 if (n > -1 && n < size) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
362 return buf; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
363 if (n > -1) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
364 size = n + 1; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
365 else |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
366 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
|
367 |
663 | 368 if ((tmp = th_realloc(buf, size * sizeof(th_char_t))) == NULL) |
133 | 369 { |
370 th_free(buf); | |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
371 return NULL; |
133 | 372 } |
373 else | |
374 buf = tmp; | |
10 | 375 } |
549
dfd6dcc486a6
Implement optional use of internal printf() implementation for use in th_strdup_vprintf().
Matti Hamalainen <ccr@tnsp.org>
parents:
531
diff
changeset
|
376 #endif |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
377 } |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
378 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
379 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
380 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
381 * 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
|
382 * for the resulting string. |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
383 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
384 * @param[in] ... optional printf arguments |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
385 * @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
|
386 */ |
663 | 387 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
|
388 { |
663 | 389 th_char_t *res; |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
390 va_list ap; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
391 |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
392 va_start(ap, fmt); |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
393 res = th_strdup_vprintf(fmt, ap); |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
394 va_end(ap); |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
395 |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
396 return res; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
397 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
398 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
399 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
400 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
401 * 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
|
402 * 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
|
403 * 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
|
404 * @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
|
405 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
406 * @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
|
407 */ |
663 | 408 void 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
|
409 { |
663 | 410 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
|
411 th_free(*buf); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
412 *buf = tmp; |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
413 } |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
414 |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
415 |
616
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
416 /** |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
417 * 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
|
418 * 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
|
419 * 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
|
420 * @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
|
421 * @param[in] fmt format string |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
422 * @param[in] ... optional printf arguments |
594f197f7005
Slight improvements to the almost non-existing Doxygen documentation.
Matti Hamalainen <ccr@tnsp.org>
parents:
606
diff
changeset
|
423 */ |
663 | 424 void 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
|
425 { |
663 | 426 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
|
427 va_list ap; |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
428 |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
429 va_start(ap, fmt); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
430 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
|
431 va_end(ap); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
432 |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
433 th_free(*buf); |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
434 *buf = tmp; |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
435 } |
10d2dc143e4b
Add helper functions th_pstr_vprintf() and th_pstr_printf().
Matti Hamalainen <ccr@tnsp.org>
parents:
29
diff
changeset
|
436 |
88 | 437 |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
438 /* 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
|
439 */ |
663 | 440 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
|
441 { |
663 | 442 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
|
443 assert(haystack != NULL); |
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
444 assert(needle != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
445 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
446 if (haystack == needle) |
10 | 447 return 0; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
448 |
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
|
449 while (*s1 && *s2) |
39 | 450 { |
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
|
451 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
|
452 if (k != 0) |
283 | 453 return k; |
10 | 454 s1++; |
455 s2++; | |
456 } | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
457 |
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
|
458 return 0; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
459 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
460 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
461 |
663 | 462 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
|
463 { |
663 | 464 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
|
465 assert(haystack != NULL); |
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
466 assert(needle != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
467 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
468 if (haystack == needle) |
10 | 469 return 0; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
470 |
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
|
471 while (n > 0 && *s1 && *s2) |
39 | 472 { |
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
|
473 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
|
474 if (k != 0) |
283 | 475 return k; |
10 | 476 s1++; |
477 s2++; | |
478 n--; | |
479 } | |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
480 |
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
|
481 return 0; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
482 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
483 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
484 |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
485 /* 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
|
486 * case-insensitively, return pointer to start of the match, |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
487 * if found, NULL otherwise. |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
488 */ |
663 | 489 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
|
490 { |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
491 if (str == NULL || needle == NULL) |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
492 return NULL; |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
493 |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
494 const size_t |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
495 slen = strlen(str), |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
496 nlen = strlen(needle); |
228
ca9cd98dbcff
Initial work on printf() style function family implementation.
Matti Hamalainen <ccr@tnsp.org>
parents:
224
diff
changeset
|
497 |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
498 if (slen < nlen) |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
499 return NULL; |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
500 |
458
694c85f4e354
Fix th_strrcasecmp(), it had a rather stupid bug.
Matti Hamalainen <ccr@tnsp.org>
parents:
457
diff
changeset
|
501 if (th_strcasecmp(str + slen - nlen, needle) == 0) |
694c85f4e354
Fix th_strrcasecmp(), it had a rather stupid bug.
Matti Hamalainen <ccr@tnsp.org>
parents:
457
diff
changeset
|
502 return str + slen - nlen; |
89
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
503 else |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
504 return NULL; |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
505 } |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
506 |
30690f5c4cae
Add new function th_strrcasecmp().
Matti Hamalainen <ccr@tnsp.org>
parents:
88
diff
changeset
|
507 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
508 /* 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
|
509 */ |
663 | 510 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
|
511 { |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
512 assert(pdst != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
513 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
514 if (src == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
515 return THERR_NULLPTR; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
516 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
517 th_free(*pdst); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
518 |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
519 size_t slen = strlen(src); |
663 | 520 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
|
521 return THERR_MALLOC; |
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
522 |
663 | 523 memcpy(*pdst, src, (slen + 1) * sizeof(th_char_t)); |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
524 |
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
525 return THERR_OK; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
526 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
527 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
528 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
529 /* 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
|
530 */ |
663 | 531 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
|
532 { |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
533 assert(pdst != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
534 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
535 if (src == NULL) |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
536 return THERR_NULLPTR; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
537 |
186
1ee46a95aa8c
Clean up the code, add argument identifiers to function prototypes and
Matti Hamalainen <ccr@tnsp.org>
parents:
175
diff
changeset
|
538 if (*pdst != NULL) |
39 | 539 { |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
540 size_t dlen = strlen(*pdst), slen = strlen(src); |
663 | 541 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
|
542 return THERR_MALLOC; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
543 |
663 | 544 memcpy((*pdst) + dlen, src, (slen + 1) * sizeof(th_char_t)); |
39 | 545 } |
546 else | |
547 { | |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
548 size_t slen = strlen(src); |
663 | 549 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
|
550 return THERR_MALLOC; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
551 |
663 | 552 memcpy(*pdst, src, (slen + 1) * sizeof(th_char_t)); |
10 | 553 } |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
554 |
559
6021ef8fc341
Return proper THERR_ error codes from th_pstr_*()
Matti Hamalainen <ccr@tnsp.org>
parents:
553
diff
changeset
|
555 return THERR_OK; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
556 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
557 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
558 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
559 /* 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
|
560 * 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
|
561 * returns pointer to the string. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
562 */ |
663 | 563 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
|
564 { |
10 | 565 assert(str != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
566 |
129 | 567 // Terminating NULL-character is not whitespace! |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
568 while (th_isspace(str[*pos])) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
569 (*pos)++; |
39 | 570 |
663 | 571 return str + *pos; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
572 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
573 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
574 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
575 /* 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
|
576 */ |
663 | 577 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
|
578 { |
10 | 579 assert(str != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
580 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
581 while (str[*pos] && str[*pos] != sep) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
582 (*pos)++; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
583 |
663 | 584 return str + *pos; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
585 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
586 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
587 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
588 /* 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
|
589 */ |
663 | 590 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
|
591 { |
10 | 592 assert(str != NULL); |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
593 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
594 while (!th_isspace(str[*pos]) && str[*pos] != sep) |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
595 (*pos)++; |
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
596 |
663 | 597 return str + *pos; |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
598 } |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
599 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
600 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
601 /* 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
|
602 * 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
|
603 * 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
|
604 * any number of characters. |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
605 */ |
593
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
606 #define TH_STRGLOB_FUNC th_strmatch |
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
607 #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
|
608 #include "th_strglob.c" |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
609 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
610 |
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
611 /* 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
|
612 */ |
593
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
613 #define TH_STRGLOB_FUNC th_strcasematch |
1a33088e7fa9
Rename some internal preprocessor macros.
Matti Hamalainen <ccr@tnsp.org>
parents:
584
diff
changeset
|
614 #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
|
615 #include "th_strglob.c" |
0
bd61a80a6c54
Initial import into Mercurial repository. Discarding old cvs/svn history
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
616 |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
617 |
663 | 618 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
|
619 { |
663 | 620 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
|
621 int len; |
ff3ebe22f6c5
Change int th_get_hex_triplet(const char *str) API to
Matti Hamalainen <ccr@tnsp.org>
parents:
488
diff
changeset
|
622 *value = 0; |
44 | 623 |
507
8bb0817210a0
Fix th_get_hex_triplet() some more ..
Matti Hamalainen <ccr@tnsp.org>
parents:
503
diff
changeset
|
624 for (len = 0; *p && len < 4 * 2; p++, len++) |
39 | 625 { |
626 if (*p >= '0' && *p <= '9') | |
627 { | |
503
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
628 (*value) <<= 4; |
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
629 (*value) |= (*p - '0'); |
39 | 630 } |
174 | 631 else |
632 if (*p >= 'A' && *p <= 'F') | |
39 | 633 { |
503
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
634 (*value) <<= 4; |
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
635 (*value) |= (*p - 'A') + 10; |
39 | 636 } |
174 | 637 else |
638 if (*p >= 'a' && *p <= 'f') | |
39 | 639 { |
503
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
640 (*value) <<= 4; |
12dbe0102d72
Fix a stupid bug in th_get_hex_triplet().
Matti Hamalainen <ccr@tnsp.org>
parents:
497
diff
changeset
|
641 (*value) |= (*p - 'a') + 10; |
39 | 642 } |
643 else | |
497
ff3ebe22f6c5
Change int th_get_hex_triplet(const char *str) API to
Matti Hamalainen <ccr@tnsp.org>
parents:
488
diff
changeset
|
644 return FALSE; |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
645 } |
44 | 646 |
507
8bb0817210a0
Fix th_get_hex_triplet() some more ..
Matti Hamalainen <ccr@tnsp.org>
parents:
503
diff
changeset
|
647 return (len >= 3 * 2 && len <= 4 * 2); |
14
e5e6370217ef
Various cleanups, additions and removals.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
648 } |
162
578d9298cc1e
Actually, move th_print_wrap() to th_string module.
Matti Hamalainen <ccr@tnsp.org>
parents:
144
diff
changeset
|
649 |
578d9298cc1e
Actually, move th_print_wrap() to th_string module.
Matti Hamalainen <ccr@tnsp.org>
parents:
144
diff
changeset
|
650 |
663 | 651 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
|
652 { |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
653 if (!th_strcasecmp(str, "yes") || |
169
a06a87b771ce
Add on/off to valid boolean values.
Matti Hamalainen <ccr@tnsp.org>
parents:
167
diff
changeset
|
654 !th_strcasecmp(str, "on") || |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
655 !th_strcasecmp(str, "true") || |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
656 !th_strcasecmp(str, "1")) |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
657 { |
457
85fa3d333556
Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents:
454
diff
changeset
|
658 *value = TRUE; |
85fa3d333556
Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents:
454
diff
changeset
|
659 return TRUE; |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
660 } |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
661 else |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
662 if (!th_strcasecmp(str, "no") || |
169
a06a87b771ce
Add on/off to valid boolean values.
Matti Hamalainen <ccr@tnsp.org>
parents:
167
diff
changeset
|
663 !th_strcasecmp(str, "off") || |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
664 !th_strcasecmp(str, "false") || |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
665 !th_strcasecmp(str, "0")) |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
666 { |
457
85fa3d333556
Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents:
454
diff
changeset
|
667 *value = FALSE; |
85fa3d333556
Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents:
454
diff
changeset
|
668 return TRUE; |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
669 } |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
670 else |
457
85fa3d333556
Actually, revert the boolean changes .. meh.
Matti Hamalainen <ccr@tnsp.org>
parents:
454
diff
changeset
|
671 return FALSE; |
167
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
672 } |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
673 |
7638fa9d191f
Add th_get_boolean() function.
Matti Hamalainen <ccr@tnsp.org>
parents:
162
diff
changeset
|
674 |
663 | 675 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
|
676 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
677 int ch; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
678 BOOL hex = FALSE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
679 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
680 // Is the value negative? |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
681 if (*str == '-') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
682 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
683 if (neg == NULL) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
684 return FALSE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
685 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
686 *neg = TRUE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
687 str++; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
688 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
689 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
690 if (neg != NULL) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
691 *neg = FALSE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
692 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
693 // Is it hexadecimal? |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
694 if (*str == '$') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
695 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
696 hex = TRUE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
697 str++; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
698 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
699 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
700 if (str[0] == '0' && str[1] == 'x') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
701 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
702 hex = TRUE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
703 str += 2; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
704 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
705 |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
706 // Parse the value |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
707 *value = 0; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
708 if (hex) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
709 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
710 while ((ch = *str++)) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
711 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
712 if (ch >= '0' && ch <= '9') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
713 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
714 *value <<= 4; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
715 *value |= ch - '0'; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
716 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
717 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
718 if (ch >= 'A' && ch <= 'F') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
719 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
720 *value <<= 4; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
721 *value |= ch - 'A' + 10; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
722 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
723 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
724 if (ch >= 'a' && ch <= 'f') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
725 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
726 *value <<= 4; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
727 *value |= ch - 'a' + 10; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
728 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
729 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
730 return FALSE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
731 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
732 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
733 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
734 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
735 while ((ch = *str++)) |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
736 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
737 if (ch >= '0' && ch <= '9') |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
738 { |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
739 *value *= 10; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
740 *value += ch - '0'; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
741 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
742 else |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
743 return FALSE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
744 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
745 } |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
746 return TRUE; |
77ad030e82c9
Add th_get_int() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents:
458
diff
changeset
|
747 } |