|
|
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 - String Handling
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 void d4_11_2();
42: static void d4_11_3();
43: void d4_11b();
44:
45:
46:
47:
48:
49:
50:
51:
52:
53: static char mem1[15] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
54: static char mem2[15] = {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9};
55: static char string1[] = "aaaaaaaaaa";
56: static char string2[] = "bbbb\0bbbb";
57: static char string3[] = "cccccccccc";
58: static char string4[21] = "dddddddddd";
59: static char string5[] = "abcdefgX\0Y";
60: static char string6[] = "abcXabcX\0Y";
61: static char string7[] = "oneXtwoYXthreeYYXXZZfourGFGF";
62: static char string8[] = "oneXtwoYXthreeYYXXZZfourGFGF";
63: static char string9[60];
64: void d4_11()
65: {
66:
67: Filename = "d411.c";
68: d4_11_2();
69: d4_11_3();
70: d4_11b();
71: }
72:
73: /*
74: * 4.11.2 - Copying functions
75: */
76: static void d4_11_2()
77: {
78: #ifndef SKIP4_112
79: int i;
80: char *p;
81:
82: /* 4.11.2.1 memcpy
83: * basic copy
84: */
85: p = memcpy(mem2, mem1, 15);
86: aequals(__LINE__, mem2, p);
87: for (i = 0; i < 15; ++i)
88: iequals(__LINE__, mem1[i], mem2[i]);
89:
90: #if ANSI
91: /* 4.11.2.2 memmove
92: * "correct" memory copy.
93: * First, shift left copy
94: */
95: memmove(mem2, mem2+1, 14);
96: for (i = 0; i < 14; ++i)
97: iequals(__LINE__, mem2[i], mem1[i+1]);
98: iequals(__LINE__, mem2[14], mem1[14]);
99:
100: /* Then shift right copy */
101: memmove(mem2+1, mem2, 14);
102: for (i = 1; i < 15; ++i)
103: iequals(__LINE__, mem2[i], mem1[i]);
104: iequals(__LINE__, mem2[0], mem2[1]);
105: #endif
106: /* 4.11.2.3 strcpy
107: * string copy
108: */
109: p = strcpy(string1+1, string2);
110: aequals(__LINE__, p, string1+1);
111: iequals(__LINE__, string1[0], 'a');
112: for (i = 1; i < 10; ++i)
113: if (i < 5)
114: iequals(__LINE__, string1[i], 'b');
115: else if (i == 5)
116: iequals(__LINE__, string1[i], 0);
117: else
118: iequals(__LINE__, string1[i], 'a');
119: iequals(__LINE__, string1[10], 0);
120:
121: /* 4.11.2.4 strncpy
122: * string copy with count
123: */
124: p = strncpy(string1, string3, 9);
125: aequals(__LINE__, p, string1);
126: for (i = 0; i < 9; ++i)
127: iequals(__LINE__, string1[i], 'c');
128: iequals(__LINE__, string1[9], 'a');
129: iequals(__LINE__, string1[10], 0);
130:
131: /* fill with nulls if too few */
132: strncpy(string1, string2, 8);
133: for (i = 0; i < 8; ++i)
134: if (i < 4)
135: iequals(__LINE__, string1[i], 'b');
136: else
137: iequals(__LINE__, string1[i], 0);
138: iequals(__LINE__, string1[9], 'a');
139: iequals(__LINE__, string1[10], 0);
140: #endif /* SKIP4_112 */
141: }
142:
143: /*
144: * 4.11.3 - Concatenation functions
145: */
146: static void d4_11_3()
147: {
148: #ifndef SKIP4_113
149: int i;
150: char *p;
151:
152: /* 4.11.3.1 strcat
153: * string concatenation
154: */
155: p = strcat(string4, string3);
156: aequals(__LINE__, p, string4);
157: for (i = 0; i < 20; ++i)
158: if (i < 10)
159: iequals(__LINE__, string4[i], 'd');
160: else
161: iequals(__LINE__, string4[i], 'c');
162: iequals(__LINE__, string4[20], 0);
163:
164: /* 4.11.3.2 strncat
165: * string concatenation with maximum length
166: */
167: string4[10] = 0;
168: /* if there are not enough chars, then it is the same as strcat */
169: p = strncat(string4, string3, 12);
170: aequals(__LINE__, p, string4);
171: for (i = 0; i < 20; ++i)
172: if (i < 10)
173: iequals(__LINE__, string4[i], 'd');
174: else
175: iequals(__LINE__, string4[i], 'c');
176: iequals(__LINE__, string4[20], 0);
177: string4[10] = 0;
178: /* otherwise concatenate fewer characters */
179: strncat(string4, string3, 4);
180: for (i = 0; i < 14; ++i)
181: if (i < 10)
182: iequals(__LINE__, string4[i], 'd');
183: else
184: iequals(__LINE__, string4[i], 'c');
185: iequals(__LINE__, string4[14], 0);
186: #endif /* SKIP4_113 */
187: }
188:
189: #else /* if SKIP411 */
190: void d4_11() { pr_skip("d4_11: SKIPPED ENTIRELY\n"); }
191: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.