|
|
1.1 ! root 1: /* The Plum Hall Validation Suite for C ! 2: * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc. ! 3: * VERSION: 4 ! 4: * DATE: 1993-01-01 ! 5: * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989. ! 6: * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site ! 7: * without specific permission from Plum Hall Inc. ! 8: */ ! 9: ! 10: ! 11: #include "flags.h" ! 12: #ifndef SKIP411 ! 13: #define LIB_TEST 1 ! 14: #include "defs.h" ! 15: ! 16: /* ! 17: * 4.11(b) - String Handling (continued) ! 18: */ ! 19: ! 20: #if ANSI ! 21: #include <stddef.h> ! 22: #include <string.h> ! 23: #else ! 24: #if ALL_STRING_FNS ! 25: char *memcpy(); ! 26: char *memset(); ! 27: char *strcpy(); ! 28: char *strncpy(); ! 29: char *strcat(); ! 30: char *strncat(); ! 31: char *memchr(); ! 32: char *strchr(); ! 33: char *strrchr(); ! 34: char *strpbrk(); ! 35: char *strtok(); ! 36: int strspn(); ! 37: int strcspn(); ! 38: #endif ! 39: #endif ! 40: ! 41: static char mem1[15] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; ! 42: static char mem2[15] = {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}; ! 43: static char string1[] = "aaaaaaaaaa"; ! 44: static char string2[] = "aaaa\0bbbb"; ! 45: static char string3[] = "cccccccccc"; ! 46: static char string4[21] = "dddddddddd"; ! 47: static char string5[] = "abcdefgX\0Y"; ! 48: static char string6[] = "abcXabcX\0Y"; ! 49: static char string7[] = "oneXtwoYXthreeYYXXZZfourGFGF"; ! 50: static char string8[] = "oneXtwoYXthreeYYXXZZfourGFGF"; ! 51: static char string9[60]; ! 52: static void d4_11_4(); ! 53: static void d4_11_5(); ! 54: static void d4_11_6(); ! 55: void d4_11b() ! 56: { ! 57: Filename = "d411b.c"; ! 58: d4_11_4(); ! 59: d4_11_5(); ! 60: d4_11_6(); ! 61: } ! 62: ! 63: ! 64: /* ! 65: * 4.11.4 - Comparison functions ! 66: */ ! 67: static void d4_11_4() ! 68: { ! 69: #ifndef SKIP4_114 ! 70: int i; ! 71: char *p; ! 72: ! 73: /* 4.11.4.1 memcmp ! 74: * memory compare ! 75: */ ! 76: checkthat(__LINE__, memcmp(string4, string3, 5) > 0); ! 77: checkthat(__LINE__, memcmp(string3, string4, 5) < 0); ! 78: checkthat(__LINE__, memcmp(string1, string2, 4) == 0); ! 79: ! 80: /* 4.11.4.2 strcmp ! 81: * string compare ! 82: */ ! 83: checkthat(__LINE__, strcmp("bbc", "abc") > 0); ! 84: checkthat(__LINE__, strcmp("abc", "bbc") < 0); ! 85: checkthat(__LINE__, strcmp("hi ma", "hi ma") == 0); ! 86: ! 87: /* 4.11.4.4 strncmp ! 88: * string compare with length ! 89: */ ! 90: checkthat(__LINE__, strncmp("bbc", "abc", 1) > 0); ! 91: checkthat(__LINE__, strncmp("abc", "bbc", 1) < 0); ! 92: checkthat(__LINE__, strncmp("hi max", "hi may", 5) == 0); ! 93: ! 94: #if ANSI8612 ! 95: /* 4.11.4.5 strxfrm ! 96: * make the string collatable through strcmp, memcmp. ! 97: * This is implementation dependent. For the "C" locale, this ! 98: * just copies the source into the target, if space permits. ! 99: */ ! 100: ! 101: checkthat(__LINE__, strxfrm(string9, string8, 60) > 0); ! 102: iequals(- __LINE__, strcmp(string9, string8), 0); ! 103: ! 104: /* 4.11.4.3 strcoll ! 105: * implementation dependent ! 106: */ ! 107: iequals(- __LINE__, strcoll(string9, string8), 0); ! 108: #if ANSI8706 ! 109: checkthat(__LINE__, strxfrm(string9, "abc", 2) == 3); /* ANSI8706: now returns required length */ ! 110: #endif ! 111: #endif ! 112: #endif /* SKIP4_114 */ ! 113: } ! 114: ! 115: ! 116: /* ! 117: * 4.11.5 - Search functions ! 118: */ ! 119: static void d4_11_5() ! 120: { ! 121: #ifndef SKIP4_115 ! 122: int i; ! 123: char *p; ! 124: ! 125: /* 4.11.5.1 memchr ! 126: * search memory ! 127: */ ! 128: p = memchr(string5, 'X', 10); ! 129: aequals(__LINE__, p, string5+7); ! 130: p = memchr(string5, 'X', 3); ! 131: aequals(__LINE__, p, (char *)0); ! 132: p = memchr(string5, 'Y', 10); ! 133: aequals(__LINE__, p, string5+9); ! 134: p = memchr(string5, 'Z', 8); ! 135: aequals(__LINE__, p, (char *)0); ! 136: ! 137: /* 4.11.5.2 strchr ! 138: * search strings ! 139: */ ! 140: p = strchr(string5, 'X'); ! 141: aequals(__LINE__, p, string5+7); ! 142: p = strchr(string5, 'Y'); ! 143: aequals(__LINE__, p, (char *)0); ! 144: ! 145: /* 4.11.5.3 strcspn ! 146: * count number of leading characters not in set ! 147: */ ! 148: iequals(__LINE__, strcspn(string5, string5), 0); ! 149: iequals(__LINE__, strcspn(string5, "ABC"), 8); ! 150: iequals(__LINE__, strcspn(string5, "ABCX"), 7); ! 151: ! 152: /* 4.11.5.4 strpbrk ! 153: * get pointer to first character in the set ! 154: */ ! 155: p = strpbrk(string5, string5); ! 156: aequals(__LINE__, p, string5); ! 157: p = strpbrk(string5, "ABC"); ! 158: aequals(__LINE__, p, (char *)0); ! 159: p = strpbrk(string5, "ABCX"); ! 160: aequals(__LINE__, p, string5+7); ! 161: ! 162: /* 4.11.5.5 strrchr ! 163: * locate last occurrence of character in a string ! 164: */ ! 165: p = strrchr(string6, 'Y'); ! 166: aequals(__LINE__, p, (char *)0); ! 167: p = strrchr(string6, 'X'); ! 168: aequals(__LINE__, p, string6+7); ! 169: ! 170: /* 4.11.5.6 strspn ! 171: * length of segment consisting of characters in set ! 172: */ ! 173: iequals(__LINE__, strspn(string6, "ABC"), 0); ! 174: iequals(__LINE__, strspn(string6, "cba"), 3); ! 175: iequals(__LINE__, strspn(string6, "cXba"), 8); ! 176: ! 177: /* 4.11.5.7 strstr ! 178: * locate a substring ! 179: */ ! 180: #if ANSI ! 181: aequals(__LINE__, strstr(string8, "one"), string8+0); ! 182: aequals(__LINE__, strstr(string8, "YX"), string8+7); ! 183: aequals(__LINE__, strstr(string8, "GFGF"), string8+24); ! 184: aequals(__LINE__, strstr(string8, "not there"), NULL); ! 185: aequals(__LINE__, strstr(string8, ""), string8); /* ANSI8703: was previously vague */ ! 186: ! 187: #endif ! 188: /* 4.11.5.8 strtok ! 189: * string parsing ! 190: */ ! 191: p = strtok(string7, "YX"); ! 192: checkthat(__LINE__, strcmp(p, "one") == 0); ! 193: p = strtok((char *)0, "YZ"); ! 194: checkthat(__LINE__, strcmp(p, "two") == 0); ! 195: p = strtok((char *)0, "ZYX"); ! 196: checkthat(__LINE__, strcmp(p, "three") == 0); ! 197: p = strtok((char *)0, "ZYXFGHIJ"); ! 198: checkthat(__LINE__, strcmp(p, "four") == 0); ! 199: /* this should detect that despite the "space", no token remains */ ! 200: p = strtok((char *)0, "FGHIJ"); ! 201: aequals(__LINE__, p, (char *)0); ! 202: /* re-initialize */ ! 203: p = strtok(string8, "XY"); ! 204: checkthat(__LINE__, strcmp(p, "one") == 0); ! 205: /* check for nothing available at first parse */ ! 206: p = strtok("XYZ", "XYZ"); ! 207: aequals(__LINE__, p, (char *)0); ! 208: #endif /* SKIP4_115 */ ! 209: } ! 210: ! 211: /* ! 212: * 4.11.6 - Miscellaneous functions ! 213: */ ! 214: static void d4_11_6() ! 215: { ! 216: #ifndef SKIP4_116 ! 217: int i; ! 218: char *p; ! 219: ! 220: /* 4.11.6.1 memset ! 221: * memory fill ! 222: */ ! 223: memcpy(mem2, mem1, 15); ! 224: p = memset(mem2+1, 99, 4); ! 225: aequals(__LINE__, mem2+1, p); ! 226: for (i = 0; i < 15; ++i) ! 227: if (1 <= i && i <= 4) ! 228: iequals(__LINE__, mem2[i], 99); ! 229: else ! 230: iequals(__LINE__, mem1[i], mem2[i]); ! 231: #if ANSI ! 232: /* 4.11.6.2 strerror ! 233: * map to an error message string. Since the string ! 234: * is implementation defined, we can only check for existance. ! 235: */ ! 236: p = strerror(0); ! 237: #endif ! 238: /* 4.11.6.3 strlen ! 239: * find string length ! 240: */ ! 241: iequals(__LINE__, strlen("123456789"), 9); ! 242: iequals(__LINE__, strlen(""), 0); ! 243: #endif /* SKIP4_116 */ ! 244: } ! 245: ! 246: ! 247: #endif /* SKIP411 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.