diff options
author | Christopher Faylor <me@cgf.cx> | 2000-09-03 03:52:30 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-09-03 03:52:30 +0000 |
commit | 42f03f675735b0ab55f86824894706e39878b5cc (patch) | |
tree | 8257fcbb3933db674d2f140ed9329c64baf19977 /winsup/testsuite/libltp/lib/databin.c | |
parent | 312a668a2270134e00534e587ff76886f8570aae (diff) | |
download | cygnal-42f03f675735b0ab55f86824894706e39878b5cc.tar.gz cygnal-42f03f675735b0ab55f86824894706e39878b5cc.tar.bz2 cygnal-42f03f675735b0ab55f86824894706e39878b5cc.zip |
Importing Egor's testsuite.
Diffstat (limited to 'winsup/testsuite/libltp/lib/databin.c')
-rw-r--r-- | winsup/testsuite/libltp/lib/databin.c | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/winsup/testsuite/libltp/lib/databin.c b/winsup/testsuite/libltp/lib/databin.c new file mode 100644 index 000000000..f09c2c86c --- /dev/null +++ b/winsup/testsuite/libltp/lib/databin.c @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan/ + */ +#include <stdio.h> +#include <sys/param.h> +#include <string.h> /* memset */ +#include <stdlib.h> /* rand */ +#include "databin.h" + +#if UNIT_TEST +#include <malloc.h> +#endif + +static char Errmsg[80]; + +void +databingen (mode, buffer, bsize, offset) +int mode; /* either a, c, r, o, z or C */ +unsigned char *buffer; /* buffer pointer */ +int bsize; /* size of buffer */ +int offset; /* offset into the file where buffer starts */ +{ +int ind; + + switch (mode) + { + default: + case 'a': /* alternating bit pattern */ + memset(buffer,0x55,bsize); + break; + + case 'c': /* checkerboard pattern */ + memset(buffer,0xf0,bsize); + break; + + case 'C': /* */ + for (ind=0;ind< bsize;ind++) { + buffer[ind] = ((offset+ind)%8 & 0177); + } + break; + + case 'o': + memset(buffer,0xff,bsize); + break; + + case 'z': + memset(buffer,0x0,bsize); + break; + + case 'r': /* random */ + for (ind=0;ind< bsize;ind++) { + buffer[ind] = (rand () & 0177) | 0100; + } + } +} + +/*********************************************************************** + * + * return values: + * >= 0 : error at byte offset into the file, offset+buffer[0-(bsize-1)] + * < 0 : no error + ***********************************************************************/ +int +databinchk(mode, buffer, bsize, offset, errmsg) +int mode; /* either a, c, r, z, o, or C */ +unsigned char *buffer; /* buffer pointer */ +int bsize; /* size of buffer */ +int offset; /* offset into the file where buffer starts */ +char **errmsg; +{ + int cnt; + unsigned char *chr; + int total; + long expbits; + long actbits; + + chr=buffer; + total=bsize; + + if ( errmsg != NULL ) { + *errmsg = Errmsg; + } + + switch (mode) + { + default: + case 'a': /* alternating bit pattern */ + expbits=0x55; + break; + + case 'c': /* checkerboard pattern */ + expbits=0xf0; + break; + + case 'C': /* counting pattern */ + for (cnt=0;cnt< bsize;cnt++) { + expbits = ((offset+cnt)%8 & 0177); + + if ( buffer[cnt] != expbits ) { + sprintf(Errmsg, + "data mismatch at offset %d, exp:%#lo, act:%#o", + offset+cnt, expbits, buffer[cnt]); + return offset+cnt; + } + } + sprintf(Errmsg, "all %d bytes match desired pattern", bsize); + return -1; + + case 'o': + expbits=0xff; + break; + + case 'z': + expbits=0; + break; + + case 'r': + return -1; /* no check can be done for random */ + } + + for (cnt=0; cnt<bsize; chr++, cnt++) { + actbits = (long)*chr; + + if ( actbits != expbits ) { + sprintf(Errmsg, "data mismatch at offset %d, exp:%#lo, act:%#lo", + offset+cnt, expbits, actbits); + return offset+cnt; + } + } + + sprintf(Errmsg, "all %d bytes match desired pattern", bsize); + return -1; /* all ok */ +} + +#if UNIT_TEST + +/*********************************************************************** + * main for doing unit testing + ***********************************************************************/ +int +main(ac, ag) +int ac; +char **ag; +{ + + int size=1023; + int offset; + int number; + unsigned char *buffer; + int ret; + char *errmsg; + + if ((buffer=(unsigned char *)malloc(size)) == NULL ) { + perror("malloc"); + exit(2); + } + + +printf("***** for a ****************************\n"); + databingen('a', buffer, size, 0); + printf("databingen('a', buffer, %d, 0)\n", size); + + ret=databinchk('a', buffer, size, 0, &errmsg); + printf("databinchk('a', buffer, %d, 0, &errmsg) returned %d: %s\n", + size, ret, errmsg); + if ( ret == -1 ) + printf("\tPASS return value of -1 as expected\n"); + else + printf("\tFAIL return value %d, expected -1\n", ret); + + offset=232400; + ret=databinchk('a', &buffer[1], size-1, offset, &errmsg); + printf("databinchk('a', &buffer[1], %d, %d, &errmsg) returned %d: %s\n", + size, offset, ret, errmsg); + if ( ret == -1 ) + printf("\tPASS return value of -1 as expected\n"); + else + printf("\tFAIL return value %d, expected -1\n", ret); + + buffer[15]= 0x0; + printf("changing char 15 (offset (%d+15) = %d) to 0x0\n", offset, offset+15); + number=offset+15; + + ret=databinchk('a', &buffer[1], size-1, offset+1, &errmsg); + printf("databinchk('a', &buffer[1], %d, %d, &errmsg) returned %d: %s\n", + size-1, offset+1, ret, errmsg); + if ( ret == number ) + printf("\tPASS return value of %d as expected\n", number); + else + printf("\tFAIL return value %d, expected %d\n", ret, number); + + + +printf("***** for c ****************************\n"); + databingen('c', buffer, size, 0); + printf("databingen('c', buffer, %d, 0)\n", size); + + ret=databinchk('c', buffer, size, 0, &errmsg); + printf("databinchk('c', buffer, %d, 0, &errmsg) returned %d: %s\n", + size, ret, errmsg); + if ( ret == -1 ) + printf("\tPASS return value of -1 as expected\n"); + else + printf("\tFAIL return value %d, expected -1\n", ret); + + offset=232400; + ret=databinchk('c', &buffer[1], size-1, offset, &errmsg); + printf("databinchk('c', &buffer[1], %d, %d, &errmsg) returned %d: %s\n", + size, offset, ret, errmsg); + if ( ret == -1 ) + printf("\tPASS return value of -1 as expected\n"); + else + printf("\tFAIL return value %d, expected -1\n", ret); + + buffer[15]= 0x0; + printf("changing char 15 (offset (%d+15) = %d) to 0x0\n", offset, offset+15); + number=offset+15; + + ret=databinchk('c', &buffer[1], size-1, offset+1, &errmsg); + printf("databinchk('c', &buffer[1], %d, %d, &errmsg) returned %d: %s\n", + size-1, offset+1, ret, errmsg); + if ( ret == number ) + printf("\tPASS return value of %d as expected\n", number); + else + printf("\tFAIL return value %d, expected %d\n", ret, number); + +printf("***** for C ****************************\n"); + + databingen('C', buffer, size, 0); + printf("databingen('C', buffer, %d, 0)\n", size); + + ret=databinchk('C', buffer, size, 0, &errmsg); + printf("databinchk('C', buffer, %d, 0, &errmsg) returned %d: %s\n", + size, ret, errmsg); + if ( ret == -1 ) + printf("\tPASS return value of -1 as expected\n"); + else + printf("\tFAIL return value %d, expected -1\n", ret); + + offset=18; + ret=databinchk('C', &buffer[18], size-18, 18, &errmsg); + printf("databinchk('C', &buffer[18], %d, 18, &errmsg) returned %d: %s\n", + size-18, ret, errmsg); + if ( ret == -1 ) + printf("\tPASS return value of -1 as expected\n"); + else + printf("\tFAIL return value %d, expected -1\n", ret); + + buffer[20]= 0x0; + buffer[21]= 0x0; + printf("changing char 20 and 21 to 0x0 (offset %d and %d)\n", 20, + 21); + + ret=databinchk('C', &buffer[18], size-18, 18, &errmsg); + printf("databinchk('C', &buffer[18], %d, 18, &errmsg) returned %d: %s\n", + size-18, ret, errmsg); + + if ( ret == 20 || ret == 21 ) + printf("\tPASS return value of %d or %d as expected\n", + 20, 21); + else + printf("\tFAIL return value %d, expected %d or %d\n", ret, + 20, 21 ); + + exit(0); + +} + +#endif + |