📄 string.c
字号:
for (i=0; i < 0x100; i++) { p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; strcpy (p, "OK"); strcpy (p+3, "BAD/WRONG"); cp = strchrnul (p, '/'); check (*cp == '\0', 9+2*i); check (cp == p+2, 10+2*i); } }}static voidtest_rawmemchr (void){ it = "rawmemchr"; (void) strcpy (one, "abcd"); check (rawmemchr (one, 'c') == one+2, 1); /* Basic test. */ check (rawmemchr (one, 'd') == one+3, 2); /* End of string. */ check (rawmemchr (one, 'a') == one, 3); /* Beginning. */ check (rawmemchr (one, '\0') == one+4, 4); /* Finding NUL. */ (void) strcpy (one, "ababa"); check (rawmemchr (one, 'b') == one+1, 5); /* Finding first. */ (void) strcpy (one, ""); check (rawmemchr (one, '\0') == one, 6); /* NUL in empty string. */ { char buf[4096]; int i; char *p; for (i=0; i < 0x100; i++) { p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; strcpy (p, "OK"); strcpy (p+3, "BAD/WRONG"); check (rawmemchr (p, 'R') == p+8, 6+i); } }}static voidtest_index (void){ it = "index"; check (index ("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy (one, "abcd"); check (index (one, 'c') == one+2, 2); /* Basic test. */ check (index (one, 'd') == one+3, 3); /* End of string. */ check (index (one, 'a') == one, 4); /* Beginning. */ check (index (one, '\0') == one+4, 5); /* Finding NUL. */ (void) strcpy (one, "ababa"); check (index (one, 'b') == one+1, 6); /* Finding first. */ (void) strcpy (one, ""); check (index (one, 'b') == NULL, 7); /* Empty string. */ check (index (one, '\0') == one, 8); /* NUL in empty string. */}static voidtest_strrchr (void){ it = "strrchr"; check (strrchr ("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy (one, "abcd"); check (strrchr (one, 'c') == one+2, 2); /* Basic test. */ check (strrchr (one, 'd') == one+3, 3); /* End of string. */ check (strrchr (one, 'a') == one, 4); /* Beginning. */ check (strrchr (one, '\0') == one+4, 5); /* Finding NUL. */ (void) strcpy (one, "ababa"); check (strrchr (one, 'b') == one+3, 6); /* Finding last. */ (void) strcpy (one, ""); check (strrchr (one, 'b') == NULL, 7); /* Empty string. */ check (strrchr (one, '\0') == one, 8); /* NUL in empty string. */ { char buf[4096]; int i; char *p; for (i=0; i < 0x100; i++) { p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; strcpy (p, "OK"); strcpy (p+3, "BAD/WRONG"); check (strrchr (p, '/') == NULL, 9+i); } }}static voidtest_memrchr (void){ size_t l; it = "memrchr"; check (memrchr ("abcd", 'z', 5) == NULL, 1); /* Not found. */ (void) strcpy (one, "abcd"); l = strlen (one) + 1; check (memrchr (one, 'c', l) == one+2, 2); /* Basic test. */ check (memrchr (one, 'd', l) == one+3, 3); /* End of string. */ check (memrchr (one, 'a', l) == one, 4); /* Beginning. */ check (memrchr (one, '\0', l) == one+4, 5); /* Finding NUL. */ (void) strcpy (one, "ababa"); l = strlen (one) + 1; check (memrchr (one, 'b', l) == one+3, 6); /* Finding last. */ (void) strcpy (one, ""); l = strlen (one) + 1; check (memrchr (one, 'b', l) == NULL, 7); /* Empty string. */ check (memrchr (one, '\0', l) == one, 8); /* NUL in empty string. */ /* now test all possible alignment and length combinations to catch bugs due to unrolled loops (assuming unrolling is limited to no more than 128 byte chunks: */ { char buf[128 + sizeof(long)]; long align, len, i, pos; for (align = 0; align < (long) sizeof(long); ++align) { for (len = 0; len < (long) (sizeof(buf) - align); ++len) { for (i = 0; i < len; ++i) buf[align + i] = 'x'; /* don't depend on memset... */ for (pos = len - 1; pos >= 0; --pos) {#if 0 printf("align %d, len %d, pos %d\n", align, len, pos);#endif check(memrchr(buf + align, 'x', len) == buf + align + pos, 9); check(memrchr(buf + align + pos + 1, 'x', len - (pos + 1)) == NULL, 10); buf[align + pos] = '-'; } } } }}static voidtest_rindex (void){ it = "rindex"; check (rindex ("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy (one, "abcd"); check (rindex (one, 'c') == one+2, 2); /* Basic test. */ check (rindex (one, 'd') == one+3, 3); /* End of string. */ check (rindex (one, 'a') == one, 4); /* Beginning. */ check (rindex (one, '\0') == one+4, 5); /* Finding NUL. */ (void) strcpy (one, "ababa"); check (rindex (one, 'b') == one+3, 6); /* Finding last. */ (void) strcpy (one, ""); check (rindex (one, 'b') == NULL, 7); /* Empty string. */ check (rindex (one, '\0') == one, 8); /* NUL in empty string. */}static voidtest_strpbrk (void){ it = "strpbrk"; check(strpbrk("abcd", "z") == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check(strpbrk(one, "c") == one+2, 2); /* Basic test. */ check(strpbrk(one, "d") == one+3, 3); /* End of string. */ check(strpbrk(one, "a") == one, 4); /* Beginning. */ check(strpbrk(one, "") == NULL, 5); /* Empty search list. */ check(strpbrk(one, "cb") == one+1, 6); /* Multiple search. */ (void) strcpy(one, "abcabdea"); check(strpbrk(one, "b") == one+1, 7); /* Finding first. */ check(strpbrk(one, "cb") == one+1, 8); /* With multiple search. */ check(strpbrk(one, "db") == one+1, 9); /* Another variant. */ (void) strcpy(one, ""); check(strpbrk(one, "bc") == NULL, 10); /* Empty string. */ (void) strcpy(one, ""); check(strpbrk(one, "bcd") == NULL, 11); /* Empty string. */ (void) strcpy(one, ""); check(strpbrk(one, "bcde") == NULL, 12); /* Empty string. */ check(strpbrk(one, "") == NULL, 13); /* Both strings empty. */ (void) strcpy(one, "abcabdea"); check(strpbrk(one, "befg") == one+1, 14); /* Finding first. */ check(strpbrk(one, "cbr") == one+1, 15); /* With multiple search. */ check(strpbrk(one, "db") == one+1, 16); /* Another variant. */ check(strpbrk(one, "efgh") == one+6, 17); /* And yet another. */}static voidtest_strstr (void){ it = "strstr"; check(strstr("abcd", "z") == NULL, 1); /* Not found. */ check(strstr("abcd", "abx") == NULL, 2); /* Dead end. */ (void) strcpy(one, "abcd"); check(strstr(one, "c") == one+2, 3); /* Basic test. */ check(strstr(one, "bc") == one+1, 4); /* Multichar. */ check(strstr(one, "d") == one+3, 5); /* End of string. */ check(strstr(one, "cd") == one+2, 6); /* Tail of string. */ check(strstr(one, "abc") == one, 7); /* Beginning. */ check(strstr(one, "abcd") == one, 8); /* Exact match. */ check(strstr(one, "abcde") == NULL, 9); /* Too long. */ check(strstr(one, "de") == NULL, 10); /* Past end. */ check(strstr(one, "") == one, 11); /* Finding empty. */ (void) strcpy(one, "ababa"); check(strstr(one, "ba") == one+1, 12); /* Finding first. */ (void) strcpy(one, ""); check(strstr(one, "b") == NULL, 13); /* Empty string. */ check(strstr(one, "") == one, 14); /* Empty in empty string. */ (void) strcpy(one, "bcbca"); check(strstr(one, "bca") == one+2, 15); /* False start. */ (void) strcpy(one, "bbbcabbca"); check(strstr(one, "bbca") == one+1, 16); /* With overlap. */}static voidtest_strspn (void){ it = "strspn"; check(strspn("abcba", "abc") == 5, 1); /* Whole string. */ check(strspn("abcba", "ab") == 2, 2); /* Partial. */ check(strspn("abc", "qx") == 0, 3); /* None. */ check(strspn("", "ab") == 0, 4); /* Null string. */ check(strspn("abc", "") == 0, 5); /* Null search list. */}static voidtest_strcspn (void){ it = "strcspn"; check(strcspn("abcba", "qx") == 5, 1); /* Whole string. */ check(strcspn("abcba", "cx") == 2, 2); /* Partial. */ check(strcspn("abc", "abc") == 0, 3); /* None. */ check(strcspn("", "ab") == 0, 4); /* Null string. */ check(strcspn("abc", "") == 3, 5); /* Null search list. */}static voidtest_strtok (void){ it = "strtok"; (void) strcpy(one, "first, second, third"); equal(strtok(one, ", "), "first", 1); /* Basic test. */ equal(one, "first", 2); equal(strtok((char *)NULL, ", "), "second", 3); equal(strtok((char *)NULL, ", "), "third", 4); check(strtok((char *)NULL, ", ") == NULL, 5); (void) strcpy(one, ", first, "); equal(strtok(one, ", "), "first", 6); /* Extra delims, 1 tok. */ check(strtok((char *)NULL, ", ") == NULL, 7); (void) strcpy(one, "1a, 1b; 2a, 2b"); equal(strtok(one, ", "), "1a", 8); /* Changing delim lists. */ equal(strtok((char *)NULL, "; "), "1b", 9); equal(strtok((char *)NULL, ", "), "2a", 10); (void) strcpy(two, "x-y"); equal(strtok(two, "-"), "x", 11); /* New string before done. */ equal(strtok((char *)NULL, "-"), "y", 12); check(strtok((char *)NULL, "-") == NULL, 13); (void) strcpy(one, "a,b, c,, ,d"); equal(strtok(one, ", "), "a", 14); /* Different separators. */ equal(strtok((char *)NULL, ", "), "b", 15); equal(strtok((char *)NULL, " ,"), "c", 16); /* Permute list too. */ equal(strtok((char *)NULL, " ,"), "d", 17); check(strtok((char *)NULL, ", ") == NULL, 18); check(strtok((char *)NULL, ", ") == NULL, 19); /* Persistence. */ (void) strcpy(one, ", "); check(strtok(one, ", ") == NULL, 20); /* No tokens. */ (void) strcpy(one, ""); check(strtok(one, ", ") == NULL, 21); /* Empty string. */ (void) strcpy(one, "abc"); equal(strtok(one, ", "), "abc", 22); /* No delimiters. */ check(strtok((char *)NULL, ", ") == NULL, 23); (void) strcpy(one, "abc"); equal(strtok(one, ""), "abc", 24); /* Empty delimiter list. */ check(strtok((char *)NULL, "") == NULL, 25); (void) strcpy(one, "abcdefgh"); (void) strcpy(one, "a,b,c"); equal(strtok(one, ","), "a", 26); /* Basics again... */ equal(strtok((char *)NULL, ","), "b", 27); equal(strtok((char *)NULL, ","), "c", 28); check(strtok((char *)NULL, ",") == NULL, 29); equal(one+6, "gh", 30); /* Stomped past end? */ equal(one, "a", 31); /* Stomped old tokens? */ equal(one+2, "b", 32); equal(one+4, "c", 33);}static voidtest_strtok_r (void){ it = "strtok_r"; (void) strcpy(one, "first, second, third"); cp = NULL; /* Always initialize cp to make sure it doesn't point to some old data. */ equal(strtok_r(one, ", ", &cp), "first", 1); /* Basic test. */ equal(one, "first", 2); equal(strtok_r((char *)NULL, ", ", &cp), "second", 3); equal(strtok_r((char *)NULL, ", ", &cp), "third", 4); check(strtok_r((char *)NULL, ", ", &cp) == NULL, 5); (void) strcpy(one, ", first, "); cp = NULL; equal(strtok_r(one, ", ", &cp), "first", 6); /* Extra delims, 1 tok. */ check(strtok_r((char *)NULL, ", ", &cp) == NULL, 7); (void) strcpy(one, "1a, 1b; 2a, 2b"); cp = NULL; equal(strtok_r(one, ", ", &cp), "1a", 8); /* Changing delim lists. */ equal(strtok_r((char *)NULL, "; ", &cp), "1b", 9); equal(strtok_r((char *)NULL, ", ", &cp), "2a", 10); (void) strcpy(two, "x-y"); cp = NULL; equal(strtok_r(two, "-", &cp), "x", 11); /* New string before done. */ equal(strtok_r((char *)NULL, "-", &cp), "y", 12); check(strtok_r((char *)NULL, "-", &cp) == NULL, 13); (void) strcpy(one, "a,b, c,, ,d"); cp = NULL; equal(strtok_r(one, ", ", &cp), "a", 14); /* Different separators. */ equal(strtok_r((char *)NULL, ", ", &cp), "b", 15); equal(strtok_r((char *)NULL, " ,", &cp), "c", 16); /* Permute list too. */ equal(strtok_r((char *)NULL, " ,", &cp), "d", 17); check(strtok_r((char *)NULL, ", ", &cp) == NULL, 18); check(strtok_r((char *)NULL, ", ", &cp) == NULL, 19); /* Persistence. */ (void) strcpy(one, ", "); cp = NULL; check(strtok_r(one, ", ", &cp) == NULL, 20); /* No tokens. */ (void) strcpy(one, ""); cp = NULL; check(strtok_r(one, ", ", &cp) == NULL, 21); /* Empty string. */ check(strtok_r((char *)NULL, ", ", &cp) == NULL, 22); /* Persistence. */ (void) strcpy(one, "abc"); cp = NULL; equal(strtok_r(one, ", ", &cp), "abc", 23); /* No delimiters. */ check(strtok_r((char *)NULL, ", ", &cp) == NULL, 24); (void) strcpy(one, "abc"); cp = NULL; equal(strtok_r(one, "", &cp), "abc", 25); /* Empty delimiter list. */ check(strtok_r((char *)NULL, "", &cp) == NULL, 26); (void) strcpy(one, "abcdefgh"); (void) strcpy(one, "a,b,c"); cp = NULL; equal(strtok_r(one, ",", &cp), "a", 27); /* Basics again... */ equal(strtok_r((char *)NULL, ",", &cp), "b", 28); equal(strtok_r((char *)NULL, ",", &cp), "c", 29); check(strtok_r((char *)NULL, ",", &cp) == NULL, 30); equal(one+6, "gh", 31); /* Stomped past end? */ equal(one, "a", 32); /* Stomped old tokens? */ equal(one+2, "b", 33); equal(one+4, "c", 34);}static voidtest_strsep (void){ char *ptr; it = "strsep"; cp = strcpy(one, "first, second, third"); equal(strsep(&cp, ", "), "first", 1); /* Basic test. */ equal(one, "first", 2); equal(strsep(&cp, ", "), "", 3); equal(strsep(&cp, ", "), "second", 4); equal(strsep(&cp, ", "), "", 5); equal(strsep(&cp, ", "), "third", 6); check(strsep(&cp, ", ") == NULL, 7); cp = strcpy(one, ", first, "); equal(strsep(&cp, ", "), "", 8); equal(strsep(&cp, ", "), "", 9); equal(strsep(&cp, ", "), "first", 10); /* Extra delims, 1 tok. */ equal(strsep(&cp, ", "), "", 11); equal(strsep(&cp, ", "), "", 12); check(strsep(&cp, ", ") == NULL, 13); cp = strcpy(one, "1a, 1b; 2a, 2b"); equal(strsep(&cp, ", "), "1a", 14); /* Changing delim lists. */ equal(strsep(&cp, ", "), "", 15); equal(strsep(&cp, "; "), "1b", 16); equal(strsep(&cp, ", "), "", 17); equal(strsep(&cp, ", "), "2a", 18); cp = strcpy(two, "x-y"); equal(strsep(&cp, "-"), "x", 19); /* New string before done. */ equal(strsep(&cp, "-"), "y", 20); check(strsep(&cp, "-") == NULL, 21); cp = strcpy(one, "a,b, c,, ,d "); equal(strsep(&cp, ", "), "a", 22); /* Different separators. */ equal(strsep(&cp, ", "), "b", 23); equal(strsep(&cp, " ,"), "", 24); equal(strsep(&cp, " ,"), "c", 25); /* Permute list too. */ equal(strsep(&cp, " ,"), "", 26); equal(strsep(&cp, " ,"), "", 27); equal(strsep(&cp, " ,"), "", 28); equal(strsep(&cp, " ,"), "d", 29); equal(strsep(&cp, " ,"), "", 30); check(strsep(&cp, ", ") == NULL, 31); check(strsep(&cp, ", ") == NULL, 32); /* Persistence. */ cp = strcpy(one, ", "); equal(strsep(&cp, ", "), "", 33); equal(strsep(&cp, ", "), "", 34); equal(strsep(&cp, ", "), "", 35); check(strsep(&cp, ", ") == NULL, 36); /* No tokens. */ cp = strcpy(one, ""); equal(strsep(&cp, ", "), "", 37); check(strsep(&cp, ", ") == NULL, 38); /* Empty string. */ cp = strcpy(one, "abc"); equal(strsep(&cp, ", "), "abc", 39); /* No delimiters. */ check(strsep(&cp, ", ") == NULL, 40); cp = strcpy(one, "abc"); equal(strsep(&cp, ""), "abc", 41); /* Empty delimiter list. */ check(strsep(&cp, "") == NULL, 42); (void) strcpy(one, "abcdefgh"); cp = strcpy(one, "a,b,c"); equal(strsep(&cp, ","), "a", 43); /* Basics again... */ equal(strsep(&cp, ","), "b", 44); equal(strsep(&cp, ","), "c", 45); check(strsep(&cp, ",") == NULL, 46); equal(one+6, "gh", 47); /* Stomped past end? */ equal(one, "a", 48); /* Stomped old tokens? */ equal(one+2, "b", 49); equal(one+4, "c", 50); { char text[] = "This,is,a,test"; char *list = strdupa (text); equal (strsep (&list, ","), "This", 51); equal (strsep (&list, ","), "is", 52); equal (strsep (&list, ","), "a", 53); equal (strsep (&list, ","), "test", 54); check (strsep (&list, ",") == NULL, 55); } cp = strcpy(one, "a,b, c,, ,d,"); equal(strsep(&cp, ","), "a", 56); /* Different separators. */ equal(strsep(&cp, ","), "b", 57); equal(strsep(&cp, ","), " c", 58); /* Permute list too. */ equal(strsep(&cp, ","), "", 59); equal(strsep(&cp, ","), " ", 60); equal(strsep(&cp, ","), "d", 61); equal(strsep(&cp, ","), "", 62); check(strsep(&cp, ",") == NULL, 63); check(strsep(&cp, ",") == NULL, 64); /* Persistence. */ cp = strcpy(one, "a,b, c,, ,d,"); equal(strsep(&cp, "xy,"), "a", 65); /* Different separators. */ equal(strsep(&cp, "x,y"), "b", 66); equal(strsep(&cp, ",xy"), " c", 67); /* Permute list too. */ equal(strsep(&cp, "xy,"), "", 68); equal(strsep(&cp, "x,y"), " ", 69); equal(strsep(&cp, ",xy"), "d", 70); equal(strsep(&cp, "xy,"), "", 71); check(strsep(&cp, "x,y") == NULL, 72); check(strsep(&cp, ",xy") == NULL, 73); /* Persistence. */ cp = strcpy(one, "ABC"); one[4] = ':'; equal(strsep(&cp, "C"), "AB", 74); /* Access beyond NUL. */ ptr = strsep(&cp, ":"); equal(ptr, "", 75); check(ptr == one + 3, 76); check(cp == NULL, 77); cp = strcpy(one, "ABC"); one[4] = ':'; equal(strsep(&cp, "CD"), "AB", 78); /* Access beyond NUL. */ ptr = strsep(&cp, ":."); equal(ptr, "", 79); check(ptr == one + 3, 80); cp = strcpy(one, "ABC"); /* No token in string. */ equal(strsep(&cp, ","), "ABC", 81); check(cp == NULL, 82); *one = '\0'; /* Empty string. */ cp = one; ptr = strsep(&cp, ","); equal(ptr, "", 83); check(ptr == one, 84); check(cp == NULL, 85); *one = '\0'; /* Empty string and no token. */ cp = one; ptr = strsep(&cp, ""); equal(ptr, "", 86); check(ptr == one , 87); check(cp == NULL, 88);}static voidtest_memcmp (void){ it = "memcmp"; check(memcmp("a", "a", 1) == 0, 1); /* Identity. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -