1 /* Test program for string(3) routines.
3 * Slightly modified from Henry Spencer's original routine.
4 * - incorporates semantic changes per the ANSI standard (original tests
5 * can be recovered by defining the symbol NOT_ANSI while compiling,
6 * except for the change of memcpy() to memmove()).
7 * - makes additional tests of functions on unaligned buffers and strings.
10 #include <sys/types.h>
17 #define STREQ(a, b) (strcmp((a), (b)) == 0)
19 char *it
= "<UNSET>"; /* Routine name for message routines. */
20 int errct
; /* count errors */
21 int waserror
= 0; /* For exit status. */
23 char uctest
[] = "\004\203"; /* For testing signedness of chars. */
24 int charsigned
; /* Result. */
29 void check(int thing
, int number
);
30 void equal(char *a
, char *b
, int number
);
31 int main(int argc
, char *argv
[]);
36 - check - complain if condition is not true
38 void check(thing
, number
)
40 int number
; /* Test number for error message. */
43 printf("%s flunked test %d\n", it
, number
);
50 - equal - complain if first two args don't strcmp as equal
52 void equal(a
, b
, number
)
55 int number
; /* Test number for error message. */
57 check(a
!= NULL
&& b
!= NULL
&& STREQ(a
, b
), number
);
71 extern char *sys_errlist
[];
83 /* First, establish whether chars are signed. */
84 if (uctest
[0] < uctest
[1])
89 /* Then, do the rest of the work. Split into two functions because
90 * some compilers get unhappy about a single immense function. */
96 return(-1); /* impossible */
101 /* Test strcmp first because we use it to test other things. */
103 check(strcmp("", "") == 0, 1);/* Trivial case. */
104 check(strcmp("a", "a") == 0, 2); /* Identity. */
105 check(strcmp("abc", "abc") == 0, 3); /* Multicharacter. */
106 check(strcmp("abc", "abcd") < 0, 4); /* Length mismatches. */
107 check(strcmp("abcd", "abc") > 0, 5);
108 check(strcmp("abcd", "abce") < 0, 6); /* Honest miscompares. */
109 check(strcmp("abce", "abcd") > 0, 7);
110 check(strcmp("a\203", "a") > 0, 8); /* Tricky if char signed. */
114 check(strcmp("a\203", "a\003") < 0, 9);
116 check(strcmp("a\203", "a\003") > 0, 9);
118 check(strcmp("a\203", "a\003") > 0, 9);
121 check(strcmp("abcd" + 1, "abcd" + 1) == 0, 10); /* Unaligned tests. */
122 check(strcmp("abcd" + 1, "abce" + 1) < 0, 11);
123 check(strcmp("abcd" + 1, "bcd") == 0, 12);
124 check(strcmp("abce" + 1, "bcd") > 0, 13);
125 check(strcmp("abcd" + 2, "bcd" + 1) == 0, 14);
126 check(strcmp("abcd" + 2, "bce" + 1) < 0, 15);
128 /* Test strcpy next because we need it to set up other tests. */
130 check(strcpy(one
, "abcd") == one
, 1); /* Returned value. */
131 equal(one
, "abcd", 2); /* Basic test. */
133 (void) strcpy(one
, "x");
134 equal(one
, "x", 3); /* Writeover. */
135 equal(one
+ 2, "cd", 4); /* Wrote too much? */
137 (void) strcpy(two
, "hi there");
138 (void) strcpy(one
, two
);
139 equal(one
, "hi there", 5); /* Basic test encore. */
140 equal(two
, "hi there", 6); /* Stomped on source? */
142 (void) strcpy(one
, "");
143 equal(one
, "", 7); /* Boundary condition. */
145 (void) strcpy(one
, "abcdef" + 1); /* Unaligned tests. */
146 equal(one
, "bcdef", 8);
147 (void) strcpy(one
+ 1, "*xy" + 1);
148 equal(one
, "bxy", 9);
149 equal(one
+ 4, "f", 10);
153 (void) strcpy(one
, "ijk");
154 check(strcat(one
, "lmn") == one
, 1); /* Returned value. */
155 equal(one
, "ijklmn", 2); /* Basic test. */
157 (void) strcpy(one
, "x");
158 (void) strcat(one
, "yz");
159 equal(one
, "xyz", 3); /* Writeover. */
160 equal(one
+ 4, "mn", 4); /* Wrote too much? */
162 (void) strcpy(one
, "gh");
163 (void) strcpy(two
, "ef");
164 (void) strcat(one
, two
);
165 equal(one
, "ghef", 5); /* Basic test encore. */
166 equal(two
, "ef", 6); /* Stomped on source? */
168 (void) strcpy(one
, "");
169 (void) strcat(one
, "");
170 equal(one
, "", 7); /* Boundary conditions. */
171 (void) strcpy(one
, "ab");
172 (void) strcat(one
, "");
174 (void) strcpy(one
, "");
175 (void) strcat(one
, "cd");
178 /* Strncat - first test it as strcat, with big counts, then test the
179 * count mechanism. */
181 (void) strcpy(one
, "ijk");
182 check(strncat(one
, "lmn", 99) == one
, 1); /* Returned value. */
183 equal(one
, "ijklmn", 2); /* Basic test. */
185 (void) strcpy(one
, "x");
186 (void) strncat(one
, "yz", 99);
187 equal(one
, "xyz", 3); /* Writeover. */
188 equal(one
+ 4, "mn", 4); /* Wrote too much? */
190 (void) strcpy(one
, "gh");
191 (void) strcpy(two
, "ef");
192 (void) strncat(one
, two
, 99);
193 equal(one
, "ghef", 5); /* Basic test encore. */
194 equal(two
, "ef", 6); /* Stomped on source? */
196 (void) strcpy(one
, "");
197 (void) strncat(one
, "", 99);
198 equal(one
, "", 7); /* Boundary conditions. */
199 (void) strcpy(one
, "ab");
200 (void) strncat(one
, "", 99);
202 (void) strcpy(one
, "");
203 (void) strncat(one
, "cd", 99);
206 (void) strcpy(one
, "ab");
207 (void) strncat(one
, "cdef", 2);
208 equal(one
, "abcd", 10); /* Count-limited. */
210 (void) strncat(one
, "gh", 0);
211 equal(one
, "abcd", 11); /* Zero count. */
213 (void) strncat(one
, "gh", 2);
214 equal(one
, "abcdgh", 12); /* Count and length equal. */
216 (void) strcpy(one
, "abcdefghij"); /* Unaligned tests. */
217 (void) strcpy(one
, "abcd");
218 (void) strcpy(one
, "abc");
219 (void) strncat(one
, "de" + 1, 1);
220 equal(one
, "abce", 13);
221 equal(one
+ 4, "", 14);
222 equal(one
+ 5, "fghij", 15);
224 /* Strncmp - first test as strcmp with big counts, then test count code. */
226 check(strncmp("", "", 99) == 0, 1); /* Trivial case. */
227 check(strncmp("a", "a", 99) == 0, 2); /* Identity. */
228 check(strncmp("abc", "abc", 99) == 0, 3); /* Multicharacter. */
229 check(strncmp("abc", "abcd", 99) < 0, 4); /* Length unequal. */
230 check(strncmp("abcd", "abc", 99) > 0, 5);
231 check(strncmp("abcd", "abce", 99) < 0, 6); /* Honestly unequal. */
232 check(strncmp("abce", "abcd", 99) > 0, 7);
233 check(strncmp("a\203", "a", 2) > 0, 8); /* Tricky if '\203' < 0 */
237 check(strncmp("a\203", "a\003", 2) < 0, 9);
239 check(strncmp("a\203", "a\003", 2) > 0, 9);
241 check(strncmp("a\203", "a\003", 2) > 0, 9);
244 check(strncmp("abce", "abcd", 3) == 0, 10); /* Count limited. */
245 check(strncmp("abce", "abc", 3) == 0, 11); /* Count == length. */
246 check(strncmp("abcd", "abce", 4) < 0, 12); /* Nudging limit. */
247 check(strncmp("abc", "def", 0) == 0, 13); /* Zero count. */
249 /* Strncpy - testing is a bit different because of odd semantics */
251 check(strncpy(one
, "abc", 4) == one
, 1); /* Returned value. */
252 equal(one
, "abc", 2); /* Did the copy go right? */
254 (void) strcpy(one
, "abcdefgh");
255 (void) strncpy(one
, "xyz", 2);
256 equal(one
, "xycdefgh", 3); /* Copy cut by count. */
258 (void) strcpy(one
, "abcdefgh");
259 (void) strncpy(one
, "xyz", 3);/* Copy cut just before NUL. */
260 equal(one
, "xyzdefgh", 4);
262 (void) strcpy(one
, "abcdefgh");
263 (void) strncpy(one
, "xyz", 4);/* Copy just includes NUL. */
264 equal(one
, "xyz", 5);
265 equal(one
+ 4, "efgh", 6); /* Wrote too much? */
267 (void) strcpy(one
, "abcdefgh");
268 (void) strncpy(one
, "xyz", 5);/* Copy includes padding. */
269 equal(one
, "xyz", 7);
270 equal(one
+ 4, "", 8);
271 equal(one
+ 5, "fgh", 9);
273 (void) strcpy(one
, "abc");
274 (void) strncpy(one
, "xyz", 0);/* Zero-length copy. */
275 equal(one
, "abc", 10);
277 (void) strncpy(one
, "", 2); /* Zero-length source. */
279 equal(one
+ 1, "", 12);
280 equal(one
+ 2, "c", 13);
282 (void) strcpy(one
, "hi there");
283 (void) strncpy(two
, one
, 9);
284 equal(two
, "hi there", 14); /* Just paranoia. */
285 equal(one
, "hi there", 15); /* Stomped on source? */
289 check(strlen("") == 0, 1); /* Empty. */
290 check(strlen("a") == 1, 2); /* Single char. */
291 check(strlen("abcd") == 4, 3);/* Multiple chars. */
292 check(strlen("abcd" + 1) == 3, 4); /* Unaligned test. */
296 check(strchr("abcd", 'z') == NULL
, 1); /* Not found. */
297 (void) strcpy(one
, "abcd");
298 check(strchr(one
, 'c') == one
+ 2, 2); /* Basic test. */
299 check(strchr(one
, 'd') == one
+ 3, 3); /* End of string. */
300 check(strchr(one
, 'a') == one
, 4); /* Beginning. */
301 check(strchr(one
, '\0') == one
+ 4, 5); /* Finding NUL. */
302 (void) strcpy(one
, "ababa");
303 check(strchr(one
, 'b') == one
+ 1, 6); /* Finding first. */
304 (void) strcpy(one
, "");
305 check(strchr(one
, 'b') == NULL
, 7); /* Empty string. */
306 check(strchr(one
, '\0') == one
, 8); /* NUL in empty string. */
308 /* Index - just like strchr */
310 check(index("abcd", 'z') == NULL
, 1); /* Not found. */
311 (void) strcpy(one
, "abcd");
312 check(index(one
, 'c') == one
+ 2, 2); /* Basic test. */
313 check(index(one
, 'd') == one
+ 3, 3); /* End of string. */
314 check(index(one
, 'a') == one
, 4); /* Beginning. */
315 check(index(one
, '\0') == one
+ 4, 5); /* Finding NUL. */
316 (void) strcpy(one
, "ababa");
317 check(index(one
, 'b') == one
+ 1, 6); /* Finding first. */
318 (void) strcpy(one
, "");
319 check(index(one
, 'b') == NULL
, 7); /* Empty string. */
320 check(index(one
, '\0') == one
, 8); /* NUL in empty string. */
324 check(strrchr("abcd", 'z') == NULL
, 1); /* Not found. */
325 (void) strcpy(one
, "abcd");
326 check(strrchr(one
, 'c') == one
+ 2, 2); /* Basic test. */
327 check(strrchr(one
, 'd') == one
+ 3, 3); /* End of string. */
328 check(strrchr(one
, 'a') == one
, 4); /* Beginning. */
329 check(strrchr(one
, '\0') == one
+ 4, 5); /* Finding NUL. */
330 (void) strcpy(one
, "ababa");
331 check(strrchr(one
, 'b') == one
+ 3, 6); /* Finding last. */
332 (void) strcpy(one
, "");
333 check(strrchr(one
, 'b') == NULL
, 7); /* Empty string. */
334 check(strrchr(one
, '\0') == one
, 8); /* NUL in empty string. */
336 /* Rindex - just like strrchr */
338 check(rindex("abcd", 'z') == NULL
, 1); /* Not found. */
339 (void) strcpy(one
, "abcd");
340 check(rindex(one
, 'c') == one
+ 2, 2); /* Basic test. */
341 check(rindex(one
, 'd') == one
+ 3, 3); /* End of string. */
342 check(rindex(one
, 'a') == one
, 4); /* Beginning. */
343 check(rindex(one
, '\0') == one
+ 4, 5); /* Finding NUL. */
344 (void) strcpy(one
, "ababa");
345 check(rindex(one
, 'b') == one
+ 3, 6); /* Finding last. */
346 (void) strcpy(one
, "");
347 check(rindex(one
, 'b') == NULL
, 7); /* Empty string. */
348 check(rindex(one
, '\0') == one
, 8); /* NUL in empty string. */
353 /* Strpbrk - somewhat like strchr */
355 check(strpbrk("abcd", "z") == NULL
, 1); /* Not found. */
356 (void) strcpy(one
, "abcd");
357 check(strpbrk(one
, "c") == one
+ 2, 2); /* Basic test. */
358 check(strpbrk(one
, "d") == one
+ 3, 3); /* End of string. */
359 check(strpbrk(one
, "a") == one
, 4); /* Beginning. */
360 check(strpbrk(one
, "") == NULL
, 5); /* Empty search list. */
361 check(strpbrk(one
, "cb") == one
+ 1, 6); /* Multiple search. */
362 (void) strcpy(one
, "abcabdea");
363 check(strpbrk(one
, "b") == one
+ 1, 7); /* Finding first. */
364 check(strpbrk(one
, "cb") == one
+ 1, 8); /* With multiple search. */
365 check(strpbrk(one
, "db") == one
+ 1, 9); /* Another variant. */
366 (void) strcpy(one
, "");
367 check(strpbrk(one
, "bc") == NULL
, 10); /* Empty string. */
368 check(strpbrk(one
, "") == NULL
, 11); /* Both strings empty. */
370 /* Strstr - somewhat like strchr */
372 check(strstr("abcd", "z") == NULL
, 1); /* Not found. */
373 check(strstr("abcd", "abx") == NULL
, 2); /* Dead end. */
374 (void) strcpy(one
, "abcd");
375 check(strstr(one
, "c") == one
+ 2, 3); /* Basic test. */
376 check(strstr(one
, "bc") == one
+ 1, 4); /* Multichar. */
377 check(strstr(one
, "d") == one
+ 3, 5); /* End of string. */
378 check(strstr(one
, "cd") == one
+ 2, 6); /* Tail of string. */
379 check(strstr(one
, "abc") == one
, 7); /* Beginning. */
380 check(strstr(one
, "abcd") == one
, 8); /* Exact match. */
381 check(strstr(one
, "abcde") == NULL
, 9); /* Too long. */
382 check(strstr(one
, "de") == NULL
, 10); /* Past end. */
384 check(strstr(one
, "") == one
+ 4, 11); /* Finding empty. */
386 check(strstr(one
, "") == one
, 11); /* Finding empty. */
388 (void) strcpy(one
, "ababa");
389 check(strstr(one
, "ba") == one
+ 1, 12); /* Finding first. */
390 (void) strcpy(one
, "");
391 check(strstr(one
, "b") == NULL
, 13); /* Empty string. */
392 check(strstr(one
, "") == one
, 14); /* Empty in empty string. */
393 (void) strcpy(one
, "bcbca");
394 check(strstr(one
, "bca") == one
+ 2, 15); /* False start. */
395 (void) strcpy(one
, "bbbcabbca");
396 check(strstr(one
, "bbca") == one
+ 1, 16); /* With overlap. */
400 check(strspn("abcba", "abc") == 5, 1); /* Whole string. */
401 check(strspn("abcba", "ab") == 2, 2); /* Partial. */
402 check(strspn("abc", "qx") == 0, 3); /* None. */
403 check(strspn("", "ab") == 0, 4); /* Null string. */
404 check(strspn("abc", "") == 0, 5); /* Null search list. */
408 check(strcspn("abcba", "qx") == 5, 1); /* Whole string. */
409 check(strcspn("abcba", "cx") == 2, 2); /* Partial. */
410 check(strcspn("abc", "abc") == 0, 3); /* None. */
411 check(strcspn("", "ab") == 0, 4); /* Null string. */
412 check(strcspn("abc", "") == 3, 5); /* Null search list. */
414 /* Strtok - the hard one */
416 (void) strcpy(one
, "first, second, third");
417 equal(strtok(one
, ", "), "first", 1); /* Basic test. */
418 equal(one
, "first", 2);
419 equal(strtok((char *) NULL
, ", "), "second", 3);
420 equal(strtok((char *) NULL
, ", "), "third", 4);
421 check(strtok((char *) NULL
, ", ") == NULL
, 5);
422 (void) strcpy(one
, ", first, ");
423 equal(strtok(one
, ", "), "first", 6); /* Extra delims, 1 tok. */
424 check(strtok((char *) NULL
, ", ") == NULL
, 7);
425 (void) strcpy(one
, "1a, 1b; 2a, 2b");
426 equal(strtok(one
, ", "), "1a", 8); /* Changing delim lists. */
427 equal(strtok((char *) NULL
, "; "), "1b", 9);
428 equal(strtok((char *) NULL
, ", "), "2a", 10);
429 (void) strcpy(two
, "x-y");
430 equal(strtok(two
, "-"), "x", 11); /* New string before done. */
431 equal(strtok((char *) NULL
, "-"), "y", 12);
432 check(strtok((char *) NULL
, "-") == NULL
, 13);
433 (void) strcpy(one
, "a,b, c,, ,d");
434 equal(strtok(one
, ", "), "a", 14); /* Different separators. */
435 equal(strtok((char *) NULL
, ", "), "b", 15);
436 equal(strtok((char *) NULL
, " ,"), "c", 16); /* Permute list too. */
437 equal(strtok((char *) NULL
, " ,"), "d", 17);
438 check(strtok((char *) NULL
, ", ") == NULL
, 18);
439 check(strtok((char *) NULL
, ", ") == NULL
, 19); /* Persistence. */
440 (void) strcpy(one
, ", ");
441 check(strtok(one
, ", ") == NULL
, 20); /* No tokens. */
442 (void) strcpy(one
, "");
443 check(strtok(one
, ", ") == NULL
, 21); /* Empty string. */
444 (void) strcpy(one
, "abc");
445 equal(strtok(one
, ", "), "abc", 22); /* No delimiters. */
446 check(strtok((char *) NULL
, ", ") == NULL
, 23);
447 (void) strcpy(one
, "abc");
448 equal(strtok(one
, ""), "abc", 24); /* Empty delimiter list. */
449 check(strtok((char *) NULL
, "") == NULL
, 25);
450 (void) strcpy(one
, "abcdefgh");
451 (void) strcpy(one
, "a,b,c");
452 equal(strtok(one
, ","), "a", 26); /* Basics again... */
453 equal(strtok((char *) NULL
, ","), "b", 27);
454 equal(strtok((char *) NULL
, ","), "c", 28);
455 check(strtok((char *) NULL
, ",") == NULL
, 29);
456 equal(one
+ 6, "gh", 30); /* Stomped past end? */
457 equal(one
, "a", 31); /* Stomped old tokens? */
458 equal(one
+ 2, "b", 32);
459 equal(one
+ 4, "c", 33);
463 check(memcmp("a", "a", 1) == 0, 1); /* Identity. */
464 check(memcmp("abc", "abc", 3) == 0, 2); /* Multicharacter. */
465 check(memcmp("abcd", "abce", 4) < 0, 3); /* Honestly unequal. */
466 check(memcmp("abce", "abcd", 4) > 0, 4);
467 check(memcmp("alph", "beta", 4) < 0, 5);
471 check(memcmp("a\203", "a\003", 2) < 0, 6);
473 check(memcmp("a\203", "a\003", 2) > 0, 6);
475 check(memcmp("a\203", "a\003", 2) > 0, 6);
478 check(memcmp("abce", "abcd", 3) == 0, 7); /* Count limited. */
479 check(memcmp("abc", "def", 0) == 0, 8); /* Zero count. */
481 check(memcmp("a" + 1, "a" + 1, 1) == 0, 9); /* Unaligned tests. */
482 check(memcmp("abc" + 1, "bc", 2) == 0, 10);
483 check(memcmp("bc", "abc" + 1, 2) == 0, 11);
484 check(memcmp("abcd" + 1, "abce" + 1, 3) < 0, 12);
485 check(memcmp("abce" + 1, "abcd" + 1, 3) > 0, 13);
487 check(memcmp("a\203" + 1, "a\003" + 1, 1) > 0, 14);
489 check(memcmp("abcde" + 1, "abcdf" + 1, 3) == 0, 15);
493 check(memchr("abcd", 'z', 4) == NULL
, 1); /* Not found. */
494 (void) strcpy(one
, "abcd");
495 check( (char *)memchr(one
, 'c', 4) == one
+ 2, 2); /* Basic test. */
496 check( (char *)memchr(one
, 'd', 4) == one
+ 3, 3); /* End of string. */
497 check( (char *)memchr(one
, 'a', 4) == one
, 4); /* Beginning. */
498 check( (char *)memchr(one
, '\0', 5) == one
+ 4, 5); /* Finding NUL. */
499 (void) strcpy(one
, "ababa");
500 check( (char *)memchr(one
, 'b', 5) == one
+ 1, 6); /* Finding first. */
501 check( (char *)memchr(one
, 'b', 0) == NULL
, 7); /* Zero count. */
502 check( (char *)memchr(one
, 'a', 1) == one
, 8); /* Singleton case. */
503 (void) strcpy(one
, "a\203b");
504 check( (char *)memchr(one
, 0203, 3) == one
+ 1, 9); /* Unsignedness. */
507 * Note that X3J11 says memcpy may fail on overlap. */
509 check( (char *)memcpy(one
, "abc", 4) == one
, 1); /* Returned value. */
510 equal(one
, "abc", 2); /* Did the copy go right? */
512 (void) strcpy(one
, "abcdefgh");
513 (void) memcpy(one
+ 1, "xyz", 2);
514 equal(one
, "axydefgh", 3); /* Basic test. */
516 (void) strcpy(one
, "abc");
517 (void) memcpy(one
, "xyz", 0);
518 equal(one
, "abc", 4); /* Zero-length copy. */
520 (void) strcpy(one
, "hi there");
521 (void) strcpy(two
, "foo");
522 (void) memcpy(two
, one
, 9);
523 equal(two
, "hi there", 5); /* Just paranoia. */
524 equal(one
, "hi there", 6); /* Stomped on source? */
526 (void) strcpy(one
, "abcde"); /* Unaligned tests. */
527 (void) memcpy(one
+ 1, "\0\0\0\0\0", 1);
529 equal(one
+ 2, "cde", 8);
530 (void) memcpy(one
+ 1, "xyz" + 1, 2);
531 equal(one
, "ayzde", 9);
532 (void) memcpy(one
+ 1, "xyz" + 1, 3);
533 equal(one
, "ayz", 10);
536 * Note that X3J11 says memmove must work regardless of overlap. */
538 check( (char *)memmove(one
, "abc", 4) == one
, 1); /* Returned value. */
539 equal(one
, "abc", 2); /* Did the copy go right? */
541 (void) strcpy(one
, "abcdefgh");
542 (void) memmove(one
+ 1, "xyz", 2);
543 equal(one
, "axydefgh", 3); /* Basic test. */
545 (void) strcpy(one
, "abc");
546 (void) memmove(one
, "xyz", 0);
547 equal(one
, "abc", 4); /* Zero-length copy. */
549 (void) strcpy(one
, "hi there");
550 (void) strcpy(two
, "foo");
551 (void) memmove(two
, one
, 9);
552 equal(two
, "hi there", 5); /* Just paranoia. */
553 equal(one
, "hi there", 6); /* Stomped on source? */
555 (void) strcpy(one
, "abcdefgh");
556 (void) memmove(one
+ 1, one
, 9);
557 equal(one
, "aabcdefgh", 7); /* Overlap, right-to-left. */
559 (void) strcpy(one
, "abcdefgh");
560 (void) memmove(one
+ 1, one
+ 2, 7);
561 equal(one
, "acdefgh", 8); /* Overlap, left-to-right. */
563 (void) strcpy(one
, "abcdefgh");
564 (void) memmove(one
, one
, 9);
565 equal(one
, "abcdefgh", 9); /* 100% overlap. */
567 (void) strcpy(one
, "abcde"); /* Unaligned tests. */
568 (void) memmove(one
+ 1, "\0\0\0\0\0", 1);
570 equal(one
+ 2, "cde", 11);
571 (void) memmove(one
+ 1, "xyz" + 1, 2);
572 equal(one
, "ayzde", 12);
573 (void) memmove(one
+ 1, "xyz" + 1, 3);
574 equal(one
, "ayz", 13);
575 (void) strcpy(one
, "abcdefgh");
576 (void) memmove(one
+ 2, one
+ 1, 8);
577 equal(one
, "abbcdefgh", 14);
579 /* Memccpy - first test like memcpy, then the search part
580 * The SVID, the only place where memccpy is mentioned, says overlap
581 * might fail, so we don't try it. Besides, it's hard to see the
582 * rationale for a non-left-to-right memccpy. */
584 check(memccpy(one
, "abc", 'q', 4) == NULL
, 1); /* Returned value. */
585 equal(one
, "abc", 2); /* Did the copy go right? */
587 (void) strcpy(one
, "abcdefgh");
588 (void) memccpy(one
+ 1, "xyz", 'q', 2);
589 equal(one
, "axydefgh", 3); /* Basic test. */
591 (void) strcpy(one
, "abc");
592 (void) memccpy(one
, "xyz", 'q', 0);
593 equal(one
, "abc", 4); /* Zero-length copy. */
595 (void) strcpy(one
, "hi there");
596 (void) strcpy(two
, "foo");
597 (void) memccpy(two
, one
, 'q', 9);
598 equal(two
, "hi there", 5); /* Just paranoia. */
599 equal(one
, "hi there", 6); /* Stomped on source? */
601 (void) strcpy(one
, "abcdefgh");
602 (void) strcpy(two
, "horsefeathers");
603 check( (char *)memccpy(two
, one
, 'f', 9) == two
+ 6, 7);/* Returned value. */
604 equal(one
, "abcdefgh", 8); /* Source intact? */
605 equal(two
, "abcdefeathers", 9); /* Copy correct? */
607 (void) strcpy(one
, "abcd");
608 (void) strcpy(two
, "bumblebee");
609 check((char *)memccpy(two
, one
, 'a', 4) == two
+ 1, 10); /* First char. */
610 equal(two
, "aumblebee", 11);
611 check((char *)memccpy(two
, one
, 'd', 4) == two
+ 4, 12); /* Last char. */
612 equal(two
, "abcdlebee", 13);
613 (void) strcpy(one
, "xyz");
614 check((char *)memccpy(two
, one
, 'x', 1) == two
+ 1, 14); /* Singleton. */
615 equal(two
, "xbcdlebee", 15);
619 (void) strcpy(one
, "abcdefgh");
620 check( (char *) memset(one
+ 1, 'x', 3) == one
+ 1, 1); /* Return value. */
621 equal(one
, "axxxefgh", 2); /* Basic test. */
623 (void) memset(one
+ 2, 'y', 0);
624 equal(one
, "axxxefgh", 3); /* Zero-length set. */
626 (void) memset(one
+ 5, 0, 1);
627 equal(one
, "axxxe", 4); /* Zero fill. */
628 equal(one
+ 6, "gh", 5); /* And the leftover. */
630 (void) memset(one
+ 2, 010045, 1);
631 equal(one
, "ax\045xe", 6); /* Unsigned char convert. */
633 /* Bcopy - much like memcpy
634 * Berklix manual is silent about overlap, so don't test it. */
636 (void) bcopy("abc", one
, 4);
637 equal(one
, "abc", 1); /* Simple copy. */
639 (void) strcpy(one
, "abcdefgh");
640 (void) bcopy("xyz", one
+ 1, 2);
641 equal(one
, "axydefgh", 2); /* Basic test. */
643 (void) strcpy(one
, "abc");
644 (void) bcopy("xyz", one
, 0);
645 equal(one
, "abc", 3); /* Zero-length copy. */
647 (void) strcpy(one
, "hi there");
648 (void) strcpy(two
, "foo");
649 (void) bcopy(one
, two
, 9);
650 equal(two
, "hi there", 4); /* Just paranoia. */
651 equal(one
, "hi there", 5); /* Stomped on source? */
655 (void) strcpy(one
, "abcdef");
657 equal(one
, "ab", 1); /* Basic test. */
658 equal(one
+ 3, "", 2);
659 equal(one
+ 4, "ef", 3);
661 (void) strcpy(one
, "abcdef");
663 equal(one
, "abcdef", 4); /* Zero-length copy. */
665 /* Bcmp - somewhat like memcmp */
667 check(bcmp("a", "a", 1) == 0, 1); /* Identity. */
668 check(bcmp("abc", "abc", 3) == 0, 2); /* Multicharacter. */
669 check(bcmp("abcd", "abce", 4) != 0, 3); /* Honestly unequal. */
670 check(bcmp("abce", "abcd", 4) != 0, 4);
671 check(bcmp("alph", "beta", 4) != 0, 5);
672 check(bcmp("abce", "abcd", 3) == 0, 6); /* Count limited. */
673 check(bcmp("abc", "def", 0) == 0, 8); /* Zero count. */
676 /* Strerror - VERY system-dependent */
678 f
= open("/", O_WRONLY
); /* Should always fail. */
679 check(f
< 0 && errno
> 0 && errno
< sys_nerr
, 1);
680 equal(strerror(errno
), sys_errlist
[errno
], 2);
682 equal(strerror(errno
), "Is a directory", 3);
685 equal(strerror(errno
), "Permission denied", 3);