1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000 Silicon Graphics, Inc.
8 #include <string.h> /* memset */
9 #include <stdlib.h> /* rand */
16 static char Errmsg[80];
19 databingen (mode, buffer, bsize, offset)
20 int mode; /* either a, c, r, o, z or C */
21 unsigned char *buffer; /* buffer pointer */
22 int bsize; /* size of buffer */
23 int offset; /* offset into the file where buffer starts */
30 case 'a': /* alternating bit pattern */
31 memset(buffer,0x55,bsize);
34 case 'c': /* checkerboard pattern */
35 memset(buffer,0xf0,bsize);
39 for (ind=0;ind< bsize;ind++) {
40 buffer[ind] = ((offset+ind)%8 & 0177);
45 memset(buffer,0xff,bsize);
49 memset(buffer,0x0,bsize);
52 case 'r': /* random */
53 for (ind=0;ind< bsize;ind++) {
54 buffer[ind] = (rand () & 0177) | 0100;
59 /***********************************************************************
62 * >= 0 : error at byte offset into the file, offset+buffer[0-(bsize-1)]
64 ***********************************************************************/
66 databinchk(mode, buffer, bsize, offset, errmsg)
67 int mode; /* either a, c, r, z, o, or C */
68 unsigned char *buffer; /* buffer pointer */
69 int bsize; /* size of buffer */
70 int offset; /* offset into the file where buffer starts */
80 if ( errmsg != NULL ) {
87 case 'a': /* alternating bit pattern */
91 case 'c': /* checkerboard pattern */
95 case 'C': /* counting pattern */
96 for (cnt=0;cnt< bsize;cnt++) {
97 expbits = ((offset+cnt)%8 & 0177);
99 if ( buffer[cnt] != expbits ) {
101 "data mismatch at offset %d, exp:%#lo, act:%#o",
102 offset+cnt, expbits, buffer[cnt]);
106 sprintf(Errmsg, "all %d bytes match desired pattern", bsize);
118 return -1; /* no check can be done for random */
121 for (cnt=0; cnt<bsize; chr++, cnt++) {
122 actbits = (long)*chr;
124 if ( actbits != expbits ) {
125 sprintf(Errmsg, "data mismatch at offset %d, exp:%#lo, act:%#lo",
126 offset+cnt, expbits, actbits);
131 sprintf(Errmsg, "all %d bytes match desired pattern", bsize);
132 return -1; /* all ok */
137 /***********************************************************************
138 * main for doing unit testing
139 ***********************************************************************/
149 unsigned char *buffer;
153 if ((buffer=(unsigned char *)malloc(size)) == NULL ) {
159 printf("***** for a ****************************\n");
160 databingen('a', buffer, size, 0);
161 printf("databingen('a', buffer, %d, 0)\n", size);
163 ret=databinchk('a', buffer, size, 0, &errmsg);
164 printf("databinchk('a', buffer, %d, 0, &errmsg) returned %d: %s\n",
167 printf("\tPASS return value of -1 as expected\n");
169 printf("\tFAIL return value %d, expected -1\n", ret);
172 ret=databinchk('a', &buffer[1], size-1, offset, &errmsg);
173 printf("databinchk('a', &buffer[1], %d, %d, &errmsg) returned %d: %s\n",
174 size, offset, ret, errmsg);
176 printf("\tPASS return value of -1 as expected\n");
178 printf("\tFAIL return value %d, expected -1\n", ret);
181 printf("changing char 15 (offset (%d+15) = %d) to 0x0\n", offset, offset+15);
184 ret=databinchk('a', &buffer[1], size-1, offset+1, &errmsg);
185 printf("databinchk('a', &buffer[1], %d, %d, &errmsg) returned %d: %s\n",
186 size-1, offset+1, ret, errmsg);
188 printf("\tPASS return value of %d as expected\n", number);
190 printf("\tFAIL return value %d, expected %d\n", ret, number);
194 printf("***** for c ****************************\n");
195 databingen('c', buffer, size, 0);
196 printf("databingen('c', buffer, %d, 0)\n", size);
198 ret=databinchk('c', buffer, size, 0, &errmsg);
199 printf("databinchk('c', buffer, %d, 0, &errmsg) returned %d: %s\n",
202 printf("\tPASS return value of -1 as expected\n");
204 printf("\tFAIL return value %d, expected -1\n", ret);
207 ret=databinchk('c', &buffer[1], size-1, offset, &errmsg);
208 printf("databinchk('c', &buffer[1], %d, %d, &errmsg) returned %d: %s\n",
209 size, offset, ret, errmsg);
211 printf("\tPASS return value of -1 as expected\n");
213 printf("\tFAIL return value %d, expected -1\n", ret);
216 printf("changing char 15 (offset (%d+15) = %d) to 0x0\n", offset, offset+15);
219 ret=databinchk('c', &buffer[1], size-1, offset+1, &errmsg);
220 printf("databinchk('c', &buffer[1], %d, %d, &errmsg) returned %d: %s\n",
221 size-1, offset+1, ret, errmsg);
223 printf("\tPASS return value of %d as expected\n", number);
225 printf("\tFAIL return value %d, expected %d\n", ret, number);
227 printf("***** for C ****************************\n");
229 databingen('C', buffer, size, 0);
230 printf("databingen('C', buffer, %d, 0)\n", size);
232 ret=databinchk('C', buffer, size, 0, &errmsg);
233 printf("databinchk('C', buffer, %d, 0, &errmsg) returned %d: %s\n",
236 printf("\tPASS return value of -1 as expected\n");
238 printf("\tFAIL return value %d, expected -1\n", ret);
241 ret=databinchk('C', &buffer[18], size-18, 18, &errmsg);
242 printf("databinchk('C', &buffer[18], %d, 18, &errmsg) returned %d: %s\n",
243 size-18, ret, errmsg);
245 printf("\tPASS return value of -1 as expected\n");
247 printf("\tFAIL return value %d, expected -1\n", ret);
251 printf("changing char 20 and 21 to 0x0 (offset %d and %d)\n", 20,
254 ret=databinchk('C', &buffer[18], size-18, 18, &errmsg);
255 printf("databinchk('C', &buffer[18], %d, 18, &errmsg) returned %d: %s\n",
256 size-18, ret, errmsg);
258 if ( ret == 20 || ret == 21 )
259 printf("\tPASS return value of %d or %d as expected\n",
262 printf("\tFAIL return value %d, expected %d or %d\n", ret,