1 /*
2 * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it would be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 *
12 * Further, this software is distributed without any warranty that it is
13 * free of the rightful claim of any third person regarding infringement
14 * or the like. Any license provided herein, whether implied or
15 * otherwise, applies only to this software file. Patent licenses, if
16 * any, provided herein do not apply to combinations of this program with
17 * other software, or any other product whatsoever.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 *
23 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24 * Mountain View, CA 94043, or:
25 *
26 * http://www.sgi.com
27 *
28 * For further information regarding this notice, see:
29 *
30 * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
31 */
32 #include <stdio.h>
33 #include <string.h>
34 #include "dataascii.h"
35
36 #define CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjiklmnopqrstuvwxyz\n"
37 #define CHARS_SIZE sizeof(CHARS)
38
39 #ifdef UNIT_TEST
40 #include <stdlib.h>
41 #endif
42
43 static char Errmsg[80];
44
dataasciigen(char * listofchars,char * buffer,int bsize,int offset)45 int dataasciigen(char *listofchars, char *buffer, int bsize, int offset)
46 {
47 int cnt;
48 int total;
49 int ind;
50 char *chr;
51 int chars_size;
52 char *charlist;
53
54 chr = buffer;
55 total = offset + bsize;
56
57 if (listofchars == NULL) {
58 charlist = CHARS;
59 chars_size = CHARS_SIZE;
60 } else {
61 charlist = listofchars;
62 chars_size = strlen(listofchars);
63 }
64
65 for (cnt = offset; cnt < total; cnt++) {
66 ind = cnt % chars_size;
67 *chr++ = charlist[ind];
68 }
69
70 return bsize;
71 }
72
dataasciichk(char * listofchars,char * buffer,int bsize,int offset,char ** errmsg)73 int dataasciichk(char *listofchars, char *buffer, int bsize,
74 int offset, char **errmsg)
75 {
76 int cnt;
77 int total;
78 int ind;
79 char *chr;
80 int chars_size;
81 char *charlist;
82
83 chr = buffer;
84 total = offset + bsize;
85
86 if (listofchars == NULL) {
87 charlist = CHARS;
88 chars_size = CHARS_SIZE;
89 } else {
90 charlist = listofchars;
91 chars_size = strlen(listofchars);
92 }
93
94 if (errmsg != NULL)
95 *errmsg = Errmsg;
96
97 for (cnt = offset; cnt < total; chr++, cnt++) {
98 ind = cnt % chars_size;
99 if (*chr != charlist[ind]) {
100 sprintf(Errmsg,
101 "data mismatch at offset %d, exp:%#o, act:%#o",
102 cnt, charlist[ind], *chr);
103 return cnt;
104 }
105 }
106
107 sprintf(Errmsg, "all %d bytes match desired pattern", bsize);
108 return -1;
109 }
110
111 #if UNIT_TEST
112
main(int ac,char ** ag)113 int main(int ac, char **ag)
114 {
115
116 int size = 1023;
117 char *buffer;
118 int ret;
119 char *errmsg;
120
121 buffer = malloc(size);
122 if (buffer == NULL) {
123 perror("malloc");
124 exit(2);
125 }
126
127 dataasciigen(NULL, buffer, size, 0);
128 printf("dataasciigen(NULL, buffer, %d, 0)\n", size);
129
130 ret = dataasciichk(NULL, buffer, size, 0, &errmsg);
131 printf("dataasciichk(NULL, buffer, %d, 0, &errmsg) returned %d %s\n",
132 size, ret, errmsg);
133
134 if (ret == -1)
135 printf("\tPASS return value is -1 as expected\n");
136 else
137 printf("\tFAIL return value is %d, expected -1\n", ret);
138
139 ret = dataasciichk(NULL, &buffer[1], size - 1, 1, &errmsg);
140 printf("dataasciichk(NULL, &buffer[1], %d, 1, &errmsg) returned %d %s\n",
141 size - 1, ret, errmsg);
142
143 if (ret == -1)
144 printf("\tPASS return value is -1 as expected\n");
145 else
146 printf("\tFAIL return value is %d, expected -1\n", ret);
147
148 buffer[25] = 0x0;
149 printf("changing char 25\n");
150
151 ret = dataasciichk(NULL, &buffer[1], size - 1, 1, &errmsg);
152 printf("dataasciichk(NULL, &buffer[1], %d, 1, &errmsg) returned %d %s\n",
153 size - 1, ret, errmsg);
154
155 if (ret == 25)
156 printf("\tPASS return value is 25 as expected\n");
157 else
158 printf("\tFAIL return value is %d, expected 25\n", ret);
159
160 dataasciigen("this is a test of the my string", buffer, size, 0);
161 printf("dataasciigen(\"this is a test of the my string\", buffer, %d, 0)\n",
162 size);
163
164 ret = dataasciichk("this is a test of the my string",
165 buffer, size, 0, &errmsg);
166 printf("dataasciichk(\"this is a test of the my string\", buffer, %d, 0, &errmsg) returned %d %s\n",
167 size, ret, errmsg);
168
169 if (ret == -1)
170 printf("\tPASS return value is -1 as expected\n");
171 else
172 printf("\tFAIL return value is %d, expected -1\n", ret);
173
174 ret =
175 dataasciichk("this is a test of the my string", &buffer[1],
176 size - 1, 1, &errmsg);
177 printf("dataasciichk(\"this is a test of the my string\", &buffer[1], %d, 1, &errmsg) returned %d %s\n",
178 size - 1, ret, errmsg);
179
180 if (ret == -1)
181 printf("\tPASS return value is -1 as expected\n");
182 else
183 printf("\tFAIL return value is %d, expected -1\n", ret);
184
185 buffer[25] = 0x0;
186 printf("changing char 25\n");
187
188 ret = dataasciichk("this is a test of the my string", &buffer[1],
189 size - 1, 1, &errmsg);
190 printf("dataasciichk(\"this is a test of the my string\", &buffer[1], %d, 1, &errmsg) returned %d %s\n",
191 size - 1, ret, errmsg);
192
193 if (ret == 25)
194 printf("\tPASS return value is 25 as expected\n");
195 else
196 printf("\tFAIL return value is %d, expected 25\n", ret);
197
198 exit(0);
199 }
200
201 #endif
202