* testsuite/winsup.api/crlf.c: New

* testsuite/winsup.api/iospeed.c: New
This commit is contained in:
DJ Delorie 2000-05-17 17:21:36 +00:00
parent 6201d15e3c
commit d3d8c2db17
5 changed files with 1289 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2000-05-17 DJ Delorie <dj@cygnus.com>
* testsuite/winsup.api/crlf.c: New
* testsuite/winsup.api/iospeed.c: New
Wed May 17 01:05:52 2000 Christopher Faylor <cgf@cygnus.com>
* path.cc (mount_info::cygdrive_posix_path): Don't add trailing slash

View File

@ -0,0 +1,527 @@
typedef enum {
Nop=100000, /* ; do nothing */
New1, /* ; reset and begin new test */
Open, /* ; open test file */
Read, /* [askfor] [get] ; read bytes into buffer */
Write, /* [expect] [bytestream] ; write to file (expect 0 = ignore)*/
Compare, /* [bytestream] ; compare buffer to given bytes */
Verify, /* [bytestream] ; compare file to given bytes */
Seek, /* [offset] [whence] ; seek in file */
Tell, /* [offset] ; compare file positions */
BufSize, /* [size] ; change the stdio buffer size */
Flush, /* ; flush the stdio stream */
Text, /* ; switch file to text mode */
Binary, /* ; switch file to binary mode */
Rep, /* [count] ; repeat 'R' bytes (used in bytestream) */
Fill, /* [posn] ; fill 'F' until given byte position */
Start, /* ; for Seek */
Current, /* ; for Seek */
End, /* ; for Seek, or end of byte stream */
Max } Opcode;
#define New New1,__LINE__
/* Byte streams are just inserted into the command stream, and must
end in an End code. */
int commands[] = {
#ifndef __DJGPP__
New,
Write, 1605, Rep, 1600, 'h', 'e', 'l', 'l', 'o', End,
Tell, 1605,
Open,
BufSize, 16,
Read, 1605, 1605,
Compare, Rep, 1600, 'h', 'e', 'l', 'l', 'o', End,
Tell, 1605,
Flush,
Tell, 1605,
Seek, 1000, Start,
Tell, 1000,
New,
Text,
Write, 2, 'x', 10, End,
Verify, 'x', 13, 10, End,
New,
Binary,
Write, 2, 'x', 10, End,
Verify, 'x', 10, End,
BufSize, 16,
New,
Binary,
Write, 0, Fill, 15, 13, 10, 'x', End,
Text, Open,
Read, 17, 17,
Compare, Fill, 15, 10, 'x', End,
Tell, 18,
New,
Binary,
Write, 0, Fill, 14, 13, 10, 'x', End,
Text, Open,
Read, 16, 16,
Compare, Fill, 14, 10, 'x', End,
Tell, 17,
New,
Binary,
Write, 0, 13, 10, 'a', 'b', End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 3,
New,
Binary,
Write, 0, 10, 'a', 'b', End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 2,
New,
Binary,
Write, 0, 13, 'a', 'b', End,
Text, Open,
Read, 2, 2,
Compare, 13, 'a', End,
Tell, 2,
New,
Binary,
Write, 0, 13, 13, 10, 'a', End,
Text, Open,
Read, 2, 2,
Compare, 13, 10, End,
Tell, 3,
New,
Binary,
Write, 0, 13, 10, 'a', 13, End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 3,
New,
Binary,
Write, 0, 13, 10, 'a', 10, End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 3,
New,
Binary,
Write, 0, 13, 13, 13, 10, 'a', 10, 10, 10, End,
Text, Open,
Read, 4, 4,
Compare, 13, 13, 10, 'a', End,
Tell, 5,
#endif
New,
Binary,
Write, 0, 13, 13, 13, 10, 'a', 'b', 13, 10, 13, 10, End,
Text, Open,
Read, 4, 4,
Compare, 13, 13, 10, 'a', End,
Tell, 5,
};
/*==========================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifndef O_BINARY
#define O_BINARY 0
#endif
#ifndef O_TEXT
#define O_TEXT 0
#endif
int errors = 0;
#define num_commands (sizeof(commands)/sizeof(commands[0]))
int pc;
int askfor, get, expect, count, posn, whence, size;
typedef struct {
unsigned char *bytes;
int max, count;
} Buffer;
Buffer rw_buf={0,0,0}, cmp_buf={0,0,0}, vfy_buf={0,0,0};
void
expand_buf(Buffer *buf, int len)
{
if (buf->max < len)
{
buf->max = len+20;
if (buf->bytes)
buf->bytes = (unsigned char *)realloc(buf->bytes, buf->max);
else
buf->bytes = (unsigned char *)malloc(buf->max);
}
}
void
get_bytestream(Buffer *buf)
{
int tpc;
int len = 0, rep, byte;
unsigned char *bp;
for (tpc = pc+1; tpc < num_commands && commands[tpc] != End; tpc++)
{
switch (commands[tpc])
{
case Rep:
len += commands[tpc+1];
tpc ++;
break;
case Fill:
if (len < commands[tpc+1])
len = commands[tpc+1];
tpc ++;
break;
default:
len ++;
break;
}
}
expand_buf(buf, len);
len = 0;
bp = buf->bytes;
for (tpc = pc+1; tpc < num_commands && commands[tpc] != End; tpc++)
{
switch (commands[tpc])
{
case Rep:
rep = commands[++tpc];
byte = 'R';
while (rep--) *bp++ = byte;
break;
case Fill:
rep = commands[++tpc];
byte = 'F';
while (bp-buf->bytes < rep) *bp++ = byte;
break;
default:
*bp++ = commands[tpc];
break;
}
}
buf->count = bp - buf->bytes;
pc = tpc;
}
char dataname[] = "crlf.dat";
int verbose=1;
void
v(char *fmt, ...)
{
va_list ap;
if (!verbose) return;
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
printf("\n");
}
void
vp(char *fmt, ...)
{
va_list ap;
if (!verbose) return;
printf("%08x: ", pc);
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
printf("\n");
}
void
errorq(int use_errno, char *fmt, ...)
{
va_list ap;
fprintf(stderr, "crlf: Error at pc=%d: ", pc);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
if (use_errno)
perror("The error was");
errors++;
}
void
error(int use_errno, char *fmt, ...)
{
va_list ap;
fprintf(stderr, "crlf: Error at pc=%d: ", pc);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
if (use_errno)
perror("The error was");
fprintf(stderr, "FAIL\n");
exit(1);
}
void
display_buf(char *which, Buffer *buf, int ofs)
{
int i;
fprintf(stderr, "%s %04x:", which, ofs);
for (i=0; i<8; i++)
if (i+ofs < buf->count)
{
unsigned char b = buf->bytes[i+ofs];
fprintf(stderr, " %02x", b);
if (isgraph(b))
fprintf(stderr, " %c ", b);
else
fprintf(stderr, " ", b);
}
fprintf(stderr, "\n");
}
void
compare_bufs(char *name, Buffer *actual, Buffer *expected)
{
int i, got_one=0;
for (i=0; i<actual->count && i<expected->count; i++)
if (actual->bytes[i] != expected->bytes[i])
{
errorq(0, "%s: byte mismatch at offset 0x%x", name, i);
got_one = 1;
break;
}
if (!got_one)
{
if (actual->count < expected->count)
errorq(0, "%s: too few bytes (0x%x vs 0x%x)", name,
actual->count, expected->count);
else if (actual->count > expected->count)
errorq(0, "%s: too many bytes (0x%x vs 0x%x)", name,
actual->count, expected->count);
else
return;
}
i -= 4;
if (i<0) i = 0;
display_buf("Actual ", actual, i);
display_buf("Expected", expected, i);
}
int
main(int argc, char **argv)
{
char *readmode = "rb";
char *writemode = "wb";
FILE *file = 0;
int i, fd;
struct stat st;
char *str;
while (argc > 1 && argv[1][0] == '-')
{
if (strcmp(argv[1], "-v") == 0)
verbose++;
argc--;
argv++;
}
size = 0;
for (pc=0; pc<num_commands; pc++)
{
switch (commands[pc])
{
case Nop:
vp("Nop");
break;
case New1:
i = commands[++pc];
vp("New %d", i);
if (file) fclose(file);
file = 0;
remove(dataname);
break;
case Open:
vp("Open");
if (file) fclose(file);
file = 0;
break;
case Read:
if (!file)
{
file = fopen(dataname, readmode);
if (size)
setvbuf(file, 0, _IOFBF, size);
}
if (!file)
error(1, "cannot open %s, mode %s", dataname, readmode);
askfor = commands[++pc];
get = commands[++pc];
vp("Read %d %d", askfor, get);
expand_buf(&rw_buf, askfor);
if (askfor == 1)
{
i = getc(file);
rw_buf.bytes[0] = i;
i = (i == EOF) ? 0 : 1;
}
else
i = fread(rw_buf.bytes, 1, askfor, file);
if (i != get)
error(0, "read wrong number of bytes (%d vs %d)", i, get);
rw_buf.count = i;
break;
case Write:
if (!file)
{
file = fopen(dataname, writemode);
if (size)
setvbuf(file, 0, _IOFBF, size);
}
if (!file)
error(1, "cannot open %s, mode %s\n", dataname, writemode);
expect = commands[++pc];
get_bytestream(&rw_buf);
vp("Write %d %d", rw_buf.count, expect);
if (askfor == 1)
{
i = putc(rw_buf.bytes[0], file);
i = (i == EOF) ? 0 : 1;
}
else
i = fwrite(rw_buf.bytes, 1, rw_buf.count, file);
if (expect && (i != expect))
error(0, "wrote wrong number of bytes (%d vs %d)", i, expect);
break;
case Compare:
get_bytestream(&cmp_buf);
vp("Compare %d/%d", rw_buf.count, cmp_buf.count);
compare_bufs("Compare", &rw_buf, &cmp_buf);
break;
case Verify:
if (file) fclose(file);
file = 0;
get_bytestream(&cmp_buf);
vp("Verify %s", dataname);
if (stat(dataname, &st))
error(1, "Can't stat %s", dataname);
expand_buf(&vfy_buf, st.st_size);
i = open(dataname, O_RDONLY|O_BINARY, 0);
vfy_buf.count = read(i, vfy_buf.bytes, st.st_size);
close(i);
compare_bufs("Verify", &vfy_buf, &cmp_buf);
break;
case Seek:
posn = commands[++pc];
whence = commands[++pc];
switch (whence)
{
case Start:
whence = SEEK_SET;
str = "Start";
break;
case Current:
whence = SEEK_CUR;
str = "Current";
break;
case End:
whence = SEEK_END;
str = "End";
break;
}
vp("Seek 0x%x %s", posn, str);
i = fseek(file, posn, whence);
if (i)
error(1, "fseek failed");
break;
case Tell:
posn = commands[++pc];
vp("Tell 0x%x", posn);
i = ftell(file);
if (i != posn)
error(0, "ftell failed, got 0x%x expected 0x%x", i, posn);
break;
case BufSize:
size = commands[++pc];
vp("BufSize 0x%x", size);
if (file)
{
fflush(file);
setvbuf(file, 0, _IOFBF, size);
}
break;
case Flush:
vp("Flush");
if (file)
fflush(file);
break;
case Text:
vp("Text");
readmode = "rt";
writemode = "wt";
break;
case Binary:
vp("Binary");
readmode = "rb";
writemode = "wb";
break;
default:
printf("Invalid command code %d at offset %d\n", commands[pc], pc);
exit(1);
}
}
if (file) fclose(file);
if (errors)
printf("FAIL: %d error%s\n", errors, errors==1?"":"s");
else
{
printf("PASS\n");
unlink (dataname);
}
return errors;
}

View File

@ -0,0 +1,115 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <windows.h>
int verbose = 0;
void
v(char *fmt, ...)
{
va_list ap;
if (!verbose) return;
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
}
#define TSIZE (1024 * 1024 * 16)
unsigned long start_tic;
void
start(FILE *f)
{
fseek(f, 0, SEEK_SET);
start_tic = GetTickCount();
}
void
end()
{
unsigned long end_tic = GetTickCount();
printf("%6d", end_tic - start_tic);
}
void
test(int linesz, int cr)
{
FILE *f = fopen("iospeed.dat", "wb");
char buf[65536];
int i, fd;
memset(buf, 'x', linesz);
buf[linesz-1] = '\n';
if (cr)
buf[linesz-2] = '\r';
for (i=0; i<TSIZE; i += linesz)
fwrite(buf, 1, linesz, f);
fclose(f);
f = fopen("iospeed.dat", "rt");
fd = fileno(f);
printf("%6d%6d", linesz, cr);
for (i=0; i<TSIZE; i+= 65536)
read(fd, buf, 65536);
start(f);
while (getc(f) != EOF);
end();
start(f);
while (fread(buf, 1, 256, f) > 0);
end();
start(f);
while (fgets(buf, 64436, f));
end();
f = fopen("iospeed.dat", "rb");
fd = fileno(f);
for (i=0; i<TSIZE; i+= 65536)
read(fd, buf, 65536);
start(f);
while (getc(f) != EOF);
end();
start(f);
while (fread(buf, 1, 256, f) > 0);
end();
start(f);
while (fgets(buf, 64436, f));
end();
printf("\n");
}
int
main(int argc, char **argv)
{
if (argc > 1 && strcmp(argv[1],"-v") == 0)
verbose = 1;
setbuf(stdout, 0);
printf(" ----- text ----- ---- binary ----\n");
printf("linesz cr getc fread fgets getc fread fgets\n");
test(4, 0);
test(64, 0);
test(4096, 0);
test(4, 1);
test(64, 1);
test(4096, 1);
remove ("iospeed.dat");
return 0;
}

View File

@ -0,0 +1,527 @@
typedef enum {
Nop=100000, /* ; do nothing */
New1, /* ; reset and begin new test */
Open, /* ; open test file */
Read, /* [askfor] [get] ; read bytes into buffer */
Write, /* [expect] [bytestream] ; write to file (expect 0 = ignore)*/
Compare, /* [bytestream] ; compare buffer to given bytes */
Verify, /* [bytestream] ; compare file to given bytes */
Seek, /* [offset] [whence] ; seek in file */
Tell, /* [offset] ; compare file positions */
BufSize, /* [size] ; change the stdio buffer size */
Flush, /* ; flush the stdio stream */
Text, /* ; switch file to text mode */
Binary, /* ; switch file to binary mode */
Rep, /* [count] ; repeat 'R' bytes (used in bytestream) */
Fill, /* [posn] ; fill 'F' until given byte position */
Start, /* ; for Seek */
Current, /* ; for Seek */
End, /* ; for Seek, or end of byte stream */
Max } Opcode;
#define New New1,__LINE__
/* Byte streams are just inserted into the command stream, and must
end in an End code. */
int commands[] = {
#ifndef __DJGPP__
New,
Write, 1605, Rep, 1600, 'h', 'e', 'l', 'l', 'o', End,
Tell, 1605,
Open,
BufSize, 16,
Read, 1605, 1605,
Compare, Rep, 1600, 'h', 'e', 'l', 'l', 'o', End,
Tell, 1605,
Flush,
Tell, 1605,
Seek, 1000, Start,
Tell, 1000,
New,
Text,
Write, 2, 'x', 10, End,
Verify, 'x', 13, 10, End,
New,
Binary,
Write, 2, 'x', 10, End,
Verify, 'x', 10, End,
BufSize, 16,
New,
Binary,
Write, 0, Fill, 15, 13, 10, 'x', End,
Text, Open,
Read, 17, 17,
Compare, Fill, 15, 10, 'x', End,
Tell, 18,
New,
Binary,
Write, 0, Fill, 14, 13, 10, 'x', End,
Text, Open,
Read, 16, 16,
Compare, Fill, 14, 10, 'x', End,
Tell, 17,
New,
Binary,
Write, 0, 13, 10, 'a', 'b', End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 3,
New,
Binary,
Write, 0, 10, 'a', 'b', End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 2,
New,
Binary,
Write, 0, 13, 'a', 'b', End,
Text, Open,
Read, 2, 2,
Compare, 13, 'a', End,
Tell, 2,
New,
Binary,
Write, 0, 13, 13, 10, 'a', End,
Text, Open,
Read, 2, 2,
Compare, 13, 10, End,
Tell, 3,
New,
Binary,
Write, 0, 13, 10, 'a', 13, End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 3,
New,
Binary,
Write, 0, 13, 10, 'a', 10, End,
Text, Open,
Read, 2, 2,
Compare, 10, 'a', End,
Tell, 3,
New,
Binary,
Write, 0, 13, 13, 13, 10, 'a', 10, 10, 10, End,
Text, Open,
Read, 4, 4,
Compare, 13, 13, 10, 'a', End,
Tell, 5,
#endif
New,
Binary,
Write, 0, 13, 13, 13, 10, 'a', 'b', 13, 10, 13, 10, End,
Text, Open,
Read, 4, 4,
Compare, 13, 13, 10, 'a', End,
Tell, 5,
};
/*==========================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifndef O_BINARY
#define O_BINARY 0
#endif
#ifndef O_TEXT
#define O_TEXT 0
#endif
int errors = 0;
#define num_commands (sizeof(commands)/sizeof(commands[0]))
int pc;
int askfor, get, expect, count, posn, whence, size;
typedef struct {
unsigned char *bytes;
int max, count;
} Buffer;
Buffer rw_buf={0,0,0}, cmp_buf={0,0,0}, vfy_buf={0,0,0};
void
expand_buf(Buffer *buf, int len)
{
if (buf->max < len)
{
buf->max = len+20;
if (buf->bytes)
buf->bytes = (unsigned char *)realloc(buf->bytes, buf->max);
else
buf->bytes = (unsigned char *)malloc(buf->max);
}
}
void
get_bytestream(Buffer *buf)
{
int tpc;
int len = 0, rep, byte;
unsigned char *bp;
for (tpc = pc+1; tpc < num_commands && commands[tpc] != End; tpc++)
{
switch (commands[tpc])
{
case Rep:
len += commands[tpc+1];
tpc ++;
break;
case Fill:
if (len < commands[tpc+1])
len = commands[tpc+1];
tpc ++;
break;
default:
len ++;
break;
}
}
expand_buf(buf, len);
len = 0;
bp = buf->bytes;
for (tpc = pc+1; tpc < num_commands && commands[tpc] != End; tpc++)
{
switch (commands[tpc])
{
case Rep:
rep = commands[++tpc];
byte = 'R';
while (rep--) *bp++ = byte;
break;
case Fill:
rep = commands[++tpc];
byte = 'F';
while (bp-buf->bytes < rep) *bp++ = byte;
break;
default:
*bp++ = commands[tpc];
break;
}
}
buf->count = bp - buf->bytes;
pc = tpc;
}
char dataname[] = "crlf.dat";
int verbose=1;
void
v(char *fmt, ...)
{
va_list ap;
if (!verbose) return;
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
printf("\n");
}
void
vp(char *fmt, ...)
{
va_list ap;
if (!verbose) return;
printf("%08x: ", pc);
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
printf("\n");
}
void
errorq(int use_errno, char *fmt, ...)
{
va_list ap;
fprintf(stderr, "crlf: Error at pc=%d: ", pc);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
if (use_errno)
perror("The error was");
errors++;
}
void
error(int use_errno, char *fmt, ...)
{
va_list ap;
fprintf(stderr, "crlf: Error at pc=%d: ", pc);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
if (use_errno)
perror("The error was");
fprintf(stderr, "FAIL\n");
exit(1);
}
void
display_buf(char *which, Buffer *buf, int ofs)
{
int i;
fprintf(stderr, "%s %04x:", which, ofs);
for (i=0; i<8; i++)
if (i+ofs < buf->count)
{
unsigned char b = buf->bytes[i+ofs];
fprintf(stderr, " %02x", b);
if (isgraph(b))
fprintf(stderr, " %c ", b);
else
fprintf(stderr, " ", b);
}
fprintf(stderr, "\n");
}
void
compare_bufs(char *name, Buffer *actual, Buffer *expected)
{
int i, got_one=0;
for (i=0; i<actual->count && i<expected->count; i++)
if (actual->bytes[i] != expected->bytes[i])
{
errorq(0, "%s: byte mismatch at offset 0x%x", name, i);
got_one = 1;
break;
}
if (!got_one)
{
if (actual->count < expected->count)
errorq(0, "%s: too few bytes (0x%x vs 0x%x)", name,
actual->count, expected->count);
else if (actual->count > expected->count)
errorq(0, "%s: too many bytes (0x%x vs 0x%x)", name,
actual->count, expected->count);
else
return;
}
i -= 4;
if (i<0) i = 0;
display_buf("Actual ", actual, i);
display_buf("Expected", expected, i);
}
int
main(int argc, char **argv)
{
char *readmode = "rb";
char *writemode = "wb";
FILE *file = 0;
int i, fd;
struct stat st;
char *str;
while (argc > 1 && argv[1][0] == '-')
{
if (strcmp(argv[1], "-v") == 0)
verbose++;
argc--;
argv++;
}
size = 0;
for (pc=0; pc<num_commands; pc++)
{
switch (commands[pc])
{
case Nop:
vp("Nop");
break;
case New1:
i = commands[++pc];
vp("New %d", i);
if (file) fclose(file);
file = 0;
remove(dataname);
break;
case Open:
vp("Open");
if (file) fclose(file);
file = 0;
break;
case Read:
if (!file)
{
file = fopen(dataname, readmode);
if (size)
setvbuf(file, 0, _IOFBF, size);
}
if (!file)
error(1, "cannot open %s, mode %s", dataname, readmode);
askfor = commands[++pc];
get = commands[++pc];
vp("Read %d %d", askfor, get);
expand_buf(&rw_buf, askfor);
if (askfor == 1)
{
i = getc(file);
rw_buf.bytes[0] = i;
i = (i == EOF) ? 0 : 1;
}
else
i = fread(rw_buf.bytes, 1, askfor, file);
if (i != get)
error(0, "read wrong number of bytes (%d vs %d)", i, get);
rw_buf.count = i;
break;
case Write:
if (!file)
{
file = fopen(dataname, writemode);
if (size)
setvbuf(file, 0, _IOFBF, size);
}
if (!file)
error(1, "cannot open %s, mode %s\n", dataname, writemode);
expect = commands[++pc];
get_bytestream(&rw_buf);
vp("Write %d %d", rw_buf.count, expect);
if (askfor == 1)
{
i = putc(rw_buf.bytes[0], file);
i = (i == EOF) ? 0 : 1;
}
else
i = fwrite(rw_buf.bytes, 1, rw_buf.count, file);
if (expect && (i != expect))
error(0, "wrote wrong number of bytes (%d vs %d)", i, expect);
break;
case Compare:
get_bytestream(&cmp_buf);
vp("Compare %d/%d", rw_buf.count, cmp_buf.count);
compare_bufs("Compare", &rw_buf, &cmp_buf);
break;
case Verify:
if (file) fclose(file);
file = 0;
get_bytestream(&cmp_buf);
vp("Verify %s", dataname);
if (stat(dataname, &st))
error(1, "Can't stat %s", dataname);
expand_buf(&vfy_buf, st.st_size);
i = open(dataname, O_RDONLY|O_BINARY, 0);
vfy_buf.count = read(i, vfy_buf.bytes, st.st_size);
close(i);
compare_bufs("Verify", &vfy_buf, &cmp_buf);
break;
case Seek:
posn = commands[++pc];
whence = commands[++pc];
switch (whence)
{
case Start:
whence = SEEK_SET;
str = "Start";
break;
case Current:
whence = SEEK_CUR;
str = "Current";
break;
case End:
whence = SEEK_END;
str = "End";
break;
}
vp("Seek 0x%x %s", posn, str);
i = fseek(file, posn, whence);
if (i)
error(1, "fseek failed");
break;
case Tell:
posn = commands[++pc];
vp("Tell 0x%x", posn);
i = ftell(file);
if (i != posn)
error(0, "ftell failed, got 0x%x expected 0x%x", i, posn);
break;
case BufSize:
size = commands[++pc];
vp("BufSize 0x%x", size);
if (file)
{
fflush(file);
setvbuf(file, 0, _IOFBF, size);
}
break;
case Flush:
vp("Flush");
if (file)
fflush(file);
break;
case Text:
vp("Text");
readmode = "rt";
writemode = "wt";
break;
case Binary:
vp("Binary");
readmode = "rb";
writemode = "wb";
break;
default:
printf("Invalid command code %d at offset %d\n", commands[pc], pc);
exit(1);
}
}
if (file) fclose(file);
if (errors)
printf("FAIL: %d error%s\n", errors, errors==1?"":"s");
else
{
printf("PASS\n");
unlink (dataname);
}
return errors;
}

View File

@ -0,0 +1,115 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <windows.h>
int verbose = 0;
void
v(char *fmt, ...)
{
va_list ap;
if (!verbose) return;
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
va_end(ap);
}
#define TSIZE (1024 * 1024 * 16)
unsigned long start_tic;
void
start(FILE *f)
{
fseek(f, 0, SEEK_SET);
start_tic = GetTickCount();
}
void
end()
{
unsigned long end_tic = GetTickCount();
printf("%6d", end_tic - start_tic);
}
void
test(int linesz, int cr)
{
FILE *f = fopen("iospeed.dat", "wb");
char buf[65536];
int i, fd;
memset(buf, 'x', linesz);
buf[linesz-1] = '\n';
if (cr)
buf[linesz-2] = '\r';
for (i=0; i<TSIZE; i += linesz)
fwrite(buf, 1, linesz, f);
fclose(f);
f = fopen("iospeed.dat", "rt");
fd = fileno(f);
printf("%6d%6d", linesz, cr);
for (i=0; i<TSIZE; i+= 65536)
read(fd, buf, 65536);
start(f);
while (getc(f) != EOF);
end();
start(f);
while (fread(buf, 1, 256, f) > 0);
end();
start(f);
while (fgets(buf, 64436, f));
end();
f = fopen("iospeed.dat", "rb");
fd = fileno(f);
for (i=0; i<TSIZE; i+= 65536)
read(fd, buf, 65536);
start(f);
while (getc(f) != EOF);
end();
start(f);
while (fread(buf, 1, 256, f) > 0);
end();
start(f);
while (fgets(buf, 64436, f));
end();
printf("\n");
}
int
main(int argc, char **argv)
{
if (argc > 1 && strcmp(argv[1],"-v") == 0)
verbose = 1;
setbuf(stdout, 0);
printf(" ----- text ----- ---- binary ----\n");
printf("linesz cr getc fread fgets getc fread fgets\n");
test(4, 0);
test(64, 0);
test(4096, 0);
test(4, 1);
test(64, 1);
test(4096, 1);
remove ("iospeed.dat");
return 0;
}