Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_FS_1_19910112
-
c/lib/test/tfseek.c
There are 5 other files named tfseek.c in the archive. Click here to see a list.
/* TFSEEK - Test FSEEK to some extent.
*/
#include <stdlib.h> /* For rand() */
#include <errno.h>
#include <string.h>
#include <stdio.h>
int flagr, flagw, flaga, flagu, flagb;
int flag7, flag8, flag9, flagC;
long poseof;
int bsize, bmask;
main(argc,argv)
char *argv[];
{
FILE *f;
int i, c, len = BUFSIZ+1;
char *argsws, *argfile = NULL, *cp;
char *fname;
if (--argc <= 0) {
printf("Usage: tfseek [stdio-mode] {-len} {file}\n");
return 0;
}
argsws = *++argv;
if (--argc > 0) {
if (**++argv == '-') {
len = atoi((*argv)+1);
if (--argc > 0)
argfile = *++argv;
} else argfile = *argv;
}
fname = argfile ? argfile : "tfseek.dat";
/* Hack switches */
for (cp = argsws; *cp; ++cp) {
switch (*cp) {
case 'r': flagr++; break;
case 'w': flagw++; break;
case 'a': flaga++; break;
case '+': flagu++; break;
case 'b': flagb++; break;
case 'C': flagC++; break;
case '7': flag7++; break;
case '8': flag8++; break;
case '9': flag9++; break;
}
}
printf("Using fopen(\"%s\", \"%s\")", fname, argsws);
if (f = fopen(fname, argsws))
printf(" OK\n");
else {
printf(" Failed! errno = %d \"%s\"\n", errno, strerror(errno));
return 0;
}
if (flag8) bsize = 8;
else if (flag9) bsize = 9;
else bsize = 7;
bmask = (1<<bsize)-1;
/* If just writing, (or writing & no file given), initialize file */
if (flagw && ((!flagr && !flagu) || (!argfile))) {
srand(1);
for (i = 0, c = rand(); i < len; ++i, ++c)
if (putc(c&bmask, f) == EOF) {
printf("ERROR: putc failed at %d of %s\n", i, fname);
return 1;
}
printf("%d chars written into \"%s\", pos = %#lo\n",
i, fname, poseof = ftell(f));
rewind(f);
printf("Rewound, pos = %#lo\n", ftell(f));
}
/* If reading, scan through */
if (flagr && !flagw && !flagu && argfile) {
for (i = 0; (c = getc(f)) != EOF; ++i);
printf("%d chars read from \"%s\", pos = %#lo\n",
i, fname, poseof = ftell(f));
rewind(f);
printf("Rewound, pos = %#lo\n", ftell(f));
return 0;
}
/* If using generated binary file, hop around checking stuff */
if (flagr && flagb && !argfile) {
long pos;
int cstart;
int errors = 0;
int tenth, tencnt;
printf("Checking %d byte values in \"%s\"...\n", len, fname);
srand(1);
cstart = rand(); /* Get starting value */
i = len; /* # tests */
tenth = i/10;
tencnt = 0;
for (i = len; --i >= 0; ) {
pos = rand() % len;
if (--tencnt <= 0) {
printf("(Test %d: %#lo/", len-i, pos);
}
if (fseek(f, (long)pos, SEEK_SET)) {
printf("ERROR: fseek(f, %#lo, SEEK_SET) failed\n", pos);
if (++errors > 10)
return 1;
continue;
}
if ((c = getc(f)) == EOF) {
printf("ERROR: getc at %#lo got EOF\n", pos);
if (++errors > 10)
return 1;
continue;
}
if ((c &= bmask) != ((cstart + pos)&bmask)) {
printf("ERROR: byte at %#lo is %o, shd be %o\n", pos,
c, (cstart+pos)&bmask);
if (++errors > 10)
return 1;
continue;
}
if (tencnt <= 0) { /* Finish off test report */
printf("%o)...\n", c);
tencnt = tenth;
}
}
if (errors == 0)
printf("\nDone, no errors!\n");
}
return 0;
#if 0
if ((f = fopen ("SEEK.DAT", "wb"))==NULL) /* Force binary */
printf("fopen(wb) of SEEK.DAT failed.\n");
printf("current pos (before writing anything) = %d\n", ftell(f));
fputc (TESTPOS, f);
printf("after writing a byte, pos = %d\n", ftell(f));
for (c = 0; c < 256; c++)
fputc (c, f);
printf("after writing all 256+1, pos = %d\n", ftell(f));
fclose (f);
if ((f = fopen ("SEEK.DAT", "rb"))==NULL)
printf("fopen(r) of SEEK.DAT failed\n");
c = fgetc (f); /* Get position to seek to */
if (fseek (f, c, SEEK_CUR) == -1)
printf("fseek to %d failed.\n", c);
/* fseekx (f, c, 1); */
printf ("value should be %d. value is %d\n", TESTPOS, fgetc(f));
#endif
}
int fseekx (stream, offset, ptrname)
FILE *stream;
long offset;
int ptrname;
{
if (ptrname == 1) {
while (offset--)
fgetc (stream);
return 0;
}
else
return fseek (stream, offset, ptrname);
}