|
|
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.