7 strtokc(char *parsestr
, const char *delims
, char **context
)
19 if ((start
== NULL
) || (delims
== NULL
)) {
24 /* Eat leading delimiters. */
25 for (cp
= start
; ; ) {
33 for (cp2
= delims
; ; ) {
36 /* This character was not a delimiter.
37 * The token starts here.
43 /* This char was a delimiter. */
44 /* Skip it, look at next character. */
55 /* Token is finished. */
59 for (cp2
= delims
; ; ) {
62 /* This character was not a delimiter.
63 * Keep it as part of current token.
68 /* This char was a delimiter. */
82 /* Same as strtokc, only you specify the destination buffer to write
83 * the token in along with its size. strntokc will write to the dst
84 * buffer, always nul-terminating it.
86 * It also returns the length of the token, or zero if there was no
87 * token. This differs from strtokc, which returns a pointer to the
88 * token or NULL for no token.
92 strntokc(char *dstTokenStart
, size_t tokenSize
, char *parsestr
, const char *delims
, char **context
)
102 lim
= dst
+ tokenSize
- 1; /* Leave room for nul byte. */
104 if (parsestr
== NULL
)
109 if ((start
== NULL
) || (delims
== NULL
)) {
114 /* Eat leading delimiters. */
115 for (cp
= start
; ; ) {
119 /* No more tokens. */
123 for (cp2
= delims
; ; ) {
126 /* This character was not a delimiter.
127 * The token starts here.
135 /* This char was a delimiter. */
136 /* Skip it, look at next character. */
147 /* Token is finished. */
151 for (cp2
= delims
; ; ) {
154 /* This character was not a delimiter.
155 * Keep it as part of current token.
160 /* This char was a delimiter. */
167 if (dst
< lim
) /* Don't overrun token size. */
173 len
= (int) (dst
- dstTokenStart
); /* Return length of token. */
175 #if (STRN_ZERO_PAD == 1)
176 /* Pad with zeros. */
177 for (++dst
; dst
<= lim
; )
179 #endif /* STRN_ZERO_PAD */
187 #ifdef TESTING_STRTOK
191 main(int argc
, char **argv
)
201 fprintf(stderr
, "Usage: test \"buffer,with,delims\" <delimiters>\n");
204 strcpy(buf
, argv
[1]);
206 t
= strtok(buf
, argv
[2]);
210 printf("strtok %d=[%s] length=%d\n", i
, t
, (int) strlen(t
));
211 t
= strtok(NULL
, argv
[2]);
215 printf("------------------------------------------------\n");
216 strcpy(buf
, argv
[1]);
218 t
= strtokc(buf
, argv
[2], &context
);
222 printf("strtokc %d=[%s] length=%d\n", i
, t
, (int) strlen(t
));
223 t
= strtokc(NULL
, argv
[2], &context
);
227 printf("------------------------------------------------\n");
228 strcpy(buf
, argv
[1]);
230 tokenLen
= strntokc(token
, sizeof(token
), buf
, argv
[2], &context
);
234 printf("strntokc %d=[%s] length=%d\n", i
, token
, tokenLen
);
235 tokenLen
= strntokc(token
, sizeof(token
), NULL
, argv
[2], &context
);
237 } while (tokenLen
> 0);