aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/testsuite/winsup.api/crlf.c527
-rw-r--r--winsup/cygwin/testsuite/winsup.api/iospeed.c115
-rw-r--r--winsup/testsuite/winsup.api/crlf.c527
-rw-r--r--winsup/testsuite/winsup.api/iospeed.c115
5 files changed, 1289 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f953401..502db20 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/testsuite/winsup.api/crlf.c b/winsup/cygwin/testsuite/winsup.api/crlf.c
new file mode 100644
index 0000000..2022234
--- /dev/null
+++ b/winsup/cygwin/testsuite/winsup.api/crlf.c
@@ -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;
+}
diff --git a/winsup/cygwin/testsuite/winsup.api/iospeed.c b/winsup/cygwin/testsuite/winsup.api/iospeed.c
new file mode 100644
index 0000000..d286f90
--- /dev/null
+++ b/winsup/cygwin/testsuite/winsup.api/iospeed.c
@@ -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;
+}
diff --git a/winsup/testsuite/winsup.api/crlf.c b/winsup/testsuite/winsup.api/crlf.c
new file mode 100644
index 0000000..2022234
--- /dev/null
+++ b/winsup/testsuite/winsup.api/crlf.c
@@ -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;
+}
diff --git a/winsup/testsuite/winsup.api/iospeed.c b/winsup/testsuite/winsup.api/iospeed.c
new file mode 100644
index 0000000..d286f90
--- /dev/null
+++ b/winsup/testsuite/winsup.api/iospeed.c
@@ -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;
+}