1 /* 2 * 3 * Copyright (c) International Business Machines Corp., 2002 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 /* 01/02/2003 Port to LTP avenkat (at) us.ibm.com */ 21 /* 06/30/2001 Port to Linux nsharoff (at) us.ibm.com */ 22 23 /* 24 * NAME 25 * string01.c - check string functions. 26 * 27 * CALLS 28 * strchr, strrchr, strcat, strcmp, strcpy, strlen, 29 * strncat, strncmp, strncpy 30 * 31 * ALGORITHM 32 * Test functionality of the string functions: 33 * (strchr, strrchr, strcat, strcmp, strcpy, strlen, 34 * strncat, strncmp, strncpy ) 35 * 36 */ 37 38 #include <stdio.h> 39 #include <sys/types.h> 40 #include <string.h> 41 42 #include <errno.h> 43 #include <stdlib.h> 44 #include "test.h" 45 46 #define FAILED 0 47 #define PASSED 1 48 49 char *TCID = "string01"; 50 51 int local_flag = PASSED; 52 int block_number; 53 FILE *temp; 54 int TST_TOTAL = 1; 55 /***** ** ** *****/ 56 57 #define LONGSTR (96*1024-1) 58 /* #define LONGSTR (1024-1) */ 59 60 /* 61 * Miscellaneous data strings for testing. 62 */ 63 64 char tiat[] = "This is a test of the string functions. "; 65 char yat[] = "This is yet another test."; 66 char tiatyat[] = 67 "This is a test of the string functions. This is yet another test."; 68 69 char longstr[LONGSTR + 1]; /* a very long string */ 70 char dst0[LONGSTR + 1]; /* place holders for various tests */ 71 char dst1[LONGSTR + 1]; 72 char dst2[LONGSTR + 1]; 73 74 75 /* Strlen (strlen( s ) == e_res) */ 76 struct t_strlen { 77 char *s; 78 int e_res; 79 } t_len[] = { 80 { 81 "", 0}, { 82 "12345", 5}, { 83 tiat, 41}, { 84 longstr, LONGSTR}, { 85 NULL, 0} 86 }; 87 88 /* Index (index( s, c ) == e_res) */ 89 struct t_index { 90 char *s; 91 char c; 92 char *e_res; 93 } t_index[] = { 94 { 95 "", 'z', NULL}, { 96 tiat, 'a', tiat + 8}, { 97 tiat, 's', tiat + 3}, { 98 tiat, 'o', tiat + 15}, { 99 tiat, 'z', NULL}, { 100 NULL, 0, NULL} 101 }; 102 103 /* Rindex (rindex( s, c ) == e_res) */ 104 struct t_rindex { 105 char *s; 106 char c; 107 char *e_res; 108 } t_rindex[] = { 109 { 110 "", 'z', NULL}, { 111 tiat, 'a', tiat + 8}, { 112 tiat, 's', tiat + 37}, { 113 tiat, 'o', tiat + 35}, { 114 tiat, 'z', NULL}, { 115 NULL, 0, NULL} 116 }; 117 118 /* Strcmp (strcmp( s1, s2 ) == e_res) */ 119 struct t_strcmp { 120 char *s1; 121 char *s2; 122 int e_res; 123 } t_cmp[] = { 124 { 125 "", "", 0}, { 126 "", tiat, -((int)'T')}, { 127 tiat, "", 'T'}, { 128 tiat, tiat, 0}, { 129 yat, tiat, 'y' - 'a'}, { 130 NULL, NULL, 0} 131 }; 132 133 /* Strcat (strcmp( strcat(s1, s2), s1s2 ) == e_res) */ 134 /* ASSUMES strcmp is working -- it is tested prior to strcat */ 135 struct t_strcat { 136 char *s1; 137 char *s2; 138 char *s1s2; 139 int e_res; 140 } t_cat[] = { 141 { 142 dst0, "", "", 0}, { 143 dst0, tiat, tiat, 0}, { 144 dst0, "", tiat, 0}, { 145 dst0, yat, tiatyat, 0}, { 146 dst1, longstr, longstr, 0}, { 147 NULL, NULL, NULL, 0} 148 }; 149 150 /* Strcpy (strcmp( strcpy(s1, s2), s1s2 ) == e_res) */ 151 /* ASSUMES strcmp is working -- it is tested prior to strcpy */ 152 /* No overlapping copies are tested */ 153 struct t_strcpy { 154 char *s1; 155 char *s2; 156 int e_res; 157 } t_cpy[] = { 158 { 159 dst0, "", 0}, { 160 dst0, tiat, 0}, { 161 dst0, longstr, 0}, { 162 NULL, NULL, 0} 163 }; 164 165 /* Strncmp (strncmp( s1, s2 ) == e_res) */ 166 struct t_strncmp { 167 char *s1; 168 char *s2; 169 int n; 170 int e_res; 171 int a_res; /* Allowable results, some platforms only return 1 or -1 */ 172 } t_ncmp[] = { 173 { 174 "", "", 0, 0, 0}, { 175 "", "", 80, 0, 0}, { 176 tiat, "", 0, 0, 0}, { 177 "", tiat, 80, -((int)'T'), -1}, { 178 tiat, "", 80, 'T', 1}, { 179 tiat, tiat, 80, 0, 0}, { 180 yat, tiat, 80, 'y' - 'a', 1}, { 181 yat, tiat, 8, 0, 1}, { 182 yat, tiat, 9, 'y' - 'a', 1}, { 183 NULL, NULL, 0, 0, 0} 184 185 }; 186 187 /* Strncat (strcmp( strncat(s1, s2, n), s1ns2 ) == e_res) */ 188 /* ASSUMES strcmp is working -- it is tested prior to strncat */ 189 /* dest is guaranteed to be all '\0' s at start of test */ 190 struct t_strncat { 191 char *s1; 192 char *s2; 193 int n; 194 char *s1ns2; 195 int e_res; 196 } t_ncat[] = { 197 /* Regular strcat stuff -- i.e., n is large enough */ 198 { 199 dst0, "", LONGSTR, "", 0}, { 200 dst0, tiat, LONGSTR, tiat, 0}, { 201 dst0, "", LONGSTR, tiat, 0}, { 202 dst0, yat, LONGSTR, tiatyat, 0}, { 203 dst1, longstr, LONGSTR, longstr, 0}, 204 /* Restricted strcat stuff */ 205 { 206 dst2, longstr, 0, "", 0}, { 207 dst2, longstr, 1, "t", 0}, { 208 dst2, longstr, LONGSTR - 1, longstr, 0}, { 209 NULL, NULL, 0, NULL, 0} 210 211 }; 212 213 /* Strncpy (strcmp( strncpy(s1, s2), s1n ) == e_res) */ 214 /* ASSUMES strcmp is working -- it is tested prior to strncpy */ 215 /* No overlapping copies are tested */ 216 struct t_strncpy { 217 char *s1; 218 char *s2; 219 int n; 220 char *s1n; 221 int e_res; 222 } t_ncpy[] = { 223 /* Regular strcpy stuff -- i.e., n is large enough */ 224 { 225 dst0, "", LONGSTR, "", 0}, { 226 dst0, tiat, LONGSTR, tiat, 0}, { 227 dst0, longstr, LONGSTR, longstr, 0}, 228 /* Restricted strcpy stuff */ 229 { 230 dst1, tiat, 0, "", 0}, { 231 dst1, longstr, 5, "ttttt", 0}, { 232 NULL, NULL, 0, NULL, 0} 233 }; 234 235 void setup(); 236 int blenter(); 237 int blexit(); 238 int anyfail(); 239 240 void setup(void) 241 { 242 temp = stderr; 243 } 244 245 int blenter(void) 246 { 247 local_flag = PASSED; 248 return 0; 249 } 250 251 int blexit(void) 252 { 253 (local_flag == PASSED) ? tst_resm(TPASS, 254 "Test passed") : tst_resm(TFAIL, 255 "Test failed"); 256 return 0; 257 } 258 259 int anyfail(void) 260 { 261 tst_exit(); 262 } 263 264 int main(int argc, char *argv[]) 265 { 266 register int n, i; 267 char *s, *pr; 268 269 tst_parse_opts(argc, argv, NULL, NULL); 270 271 /* 272 * Init longstr 273 */ 274 275 s = longstr; 276 n = LONGSTR; 277 while (n--) 278 *s++ = 't'; 279 *s = '\0'; 280 281 setup(); 282 /*--------------------------------------------------------------*/ 283 284 /* 285 * Index 286 */ 287 //fprintf(temp, "\tStrchr\n" ); 288 i = 0; 289 while (t_index[i].s) { 290 if ((pr = 291 strchr(t_index[i].s, t_index[i].c)) != t_index[i].e_res) { 292 fprintf(temp, "(Strchr) test %d", i); 293 local_flag = FAILED; 294 } 295 i++; 296 } 297 /* 298 * Strrchr 299 */ 300 //fprintf(temp, "\tStrrchr\n" ); 301 i = 0; 302 while (t_rindex[i].s) { 303 if ((pr = strrchr(t_rindex[i].s, t_rindex[i].c)) 304 != t_rindex[i].e_res) { 305 fprintf(temp, "(Strrchr) test %d", i); 306 local_flag = FAILED; 307 } 308 i++; 309 } 310 /* 311 * Strlen 312 */ 313 //fprintf(temp, "\tStrlen\n" ); 314 i = 0; 315 while (t_len[i].s) { 316 if ((n = strlen(t_len[i].s)) != t_len[i].e_res) { 317 fprintf(temp, "(Strlen) test %d: expected %d, got %d", 318 i, t_len[i].e_res, n); 319 local_flag = FAILED; 320 } 321 i++; 322 } 323 324 /* 325 * Strcmp 326 */ 327 //fprintf(temp, "\tStrcmp\n" ); 328 i = 0; 329 #define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0)) 330 while (t_cmp[i].s1) { 331 n = strcmp(t_cmp[i].s1, t_cmp[i].s2); 332 if (sign(n) != sign(t_cmp[i].e_res)) { 333 fprintf(temp, "(Strcmp) test %d: expected %d, got %d", 334 i, sign(t_cmp[i].e_res), sign(n)); 335 local_flag = FAILED; 336 } 337 i++; 338 } 339 340 /* 341 * Strcat 342 */ 343 //fprintf(temp, "\tStrcat\n" ); 344 memset(dst0, 0, LONGSTR + 1); /* clean slate */ 345 memset(dst1, 0, LONGSTR + 1); /* clean slate */ 346 i = 0; 347 while (t_cat[i].s1) { 348 if ((n = 349 strcmp(strcat(t_cat[i].s1, t_cat[i].s2), t_cat[i].s1s2)) 350 != t_cat[i].e_res) { 351 fprintf(temp, "(Strcat) test %d: expected %d, got %d", 352 i, t_cat[i].e_res, n); 353 local_flag = FAILED; 354 } 355 i++; 356 } 357 358 /* 359 * Strcpy 360 */ 361 //fprintf(temp, "\tStrcpy\n" ); 362 i = 0; 363 while (t_cpy[i].s1) { 364 if ((n = strcmp(strcpy(t_cpy[i].s1, t_cpy[i].s2), t_cpy[i].s2)) 365 != t_cpy[i].e_res) { 366 fprintf(temp, "(Strcpy) test %d: expected %d, got %d", 367 i, t_cpy[i].e_res, n); 368 local_flag = FAILED; 369 } 370 i++; 371 } 372 373 /* 374 * Strncat 375 */ 376 //fprintf(temp, "\tStrncat\n" ); 377 memset(dst0, 0, LONGSTR + 1); /* clean slate */ 378 memset(dst1, 0, LONGSTR + 1); /* clean slate */ 379 memset(dst2, 0, LONGSTR + 1); /* clean slate */ 380 i = 0; 381 while (t_ncat[i].s1) { 382 if ((n = 383 strcmp(strncat(t_ncat[i].s1, t_ncat[i].s2, t_ncat[i].n), 384 t_ncat[i].s1ns2)) != t_ncat[i].e_res) { 385 fprintf(temp, "(Strncat) test %d: expected %d, got %d", 386 i, t_ncat[i].e_res, n); 387 local_flag = FAILED; 388 } 389 i++; 390 } 391 392 /* 393 * Strncmp 394 */ 395 //fprintf(temp, "\tStrncmp\n" ); 396 i = 0; 397 while (t_ncmp[i].s1) { 398 if ((n = strncmp(t_ncmp[i].s1, t_ncmp[i].s2, t_ncmp[i].n)) 399 != t_ncmp[i].e_res) { 400 if ((t_ncmp[i].a_res < 0 && n > t_ncmp[i].a_res) 401 || (t_ncmp[i].a_res > 0 && n < t_ncmp[i].a_res)) { 402 fprintf(temp, 403 "(Strncmp) test %d: expected %d, got %d", 404 i, t_ncmp[i].e_res, n); 405 local_flag = FAILED; 406 } 407 } 408 i++; 409 } 410 411 /* 412 * Strncpy 413 */ 414 //fprintf(temp, "\tStrncpy\n" ); 415 i = 0; 416 memset(dst0, 0, LONGSTR + 1); /* clean slate */ 417 memset(dst1, 0, LONGSTR + 1); /* clean slate */ 418 while (t_ncpy[i].s1) { 419 if ((n = 420 strcmp(strncpy(t_ncpy[i].s1, t_ncpy[i].s2, t_ncpy[i].n), 421 t_ncpy[i].s1n)) != t_ncpy[i].e_res) { 422 fprintf(temp, "(Strncpy) test %d: expected %d, got %d", 423 i, t_ncpy[i].e_res, n); 424 local_flag = FAILED; 425 } 426 i++; 427 } 428 429 blexit(); 430 anyfail(); 431 tst_exit(); 432 } 433