/*
* If this compiles and runs successfully, your stdio is very probably
* compatible with stdio.fast.
* Buffers by default; -u stops buffering.
* Writes on stdout by default; -i reads from stdin.
*/
#include <stdio.h>
FILE *fp = stdout;
int status = 0;
main(argc, argv)
char **argv;
{
int wantbuf = 1, usestdin = 0, nosetbuf = 0;
char line[1024];
static char buf[BUFSIZ];
static char buggered[] =
"Your stdio appears to be buggered: fwrite of 4 bytes doesn't yield 4.\n";
for (; argc > 1; argv++, argc--) {
if (strcmp(argv[1], "-u") == 0)
wantbuf = 0;
if (strcmp(argv[1], "-i") == 0) {
usestdin = 1;
fp = stdin;
}
if (strcmp(argv[1], "-f") == 0)
fp = fopen("/tmp/stdiock", "w");
if (strcmp(argv[1], "-n") == 0)
nosetbuf = 1;
}
evalfile("start");
if (nosetbuf)
;
else if (wantbuf) {
setbuf(fp, buf);
evalfile("setbuf(buf)");
} else {
setbuf(fp, (char *)NULL);
evalfile("setbuf(0)");
}
if (usestdin) {
(void) fgets(line, sizeof line, fp);
evalfile("fgets");
} else {
if (fwrite("your", 1, 4, fp) != 4) {
status = 1;
(void) write(1, buggered, strlen(buggered));
}
evalfile("fwrite");
(void) fputs(" stdio seems to be ", stdout);
evalfile("fputs");
}
if (wantbuf && fp->_ptr == NULL) {
status = 1;
(void) fputs("incompatible (_ptr) ", stdout);
} else
(void) fputs("compatible (_ptr) ", stdout);
if (fp->_cnt >= 0 && (nosetbuf || fp->_cnt <= BUFSIZ))
(void) fputs("compatible (_cnt)", stdout);
else {
status = 1;
(void) fputs("incompatible (_cnt)", stdout);
}
evalfile("test");
(void) fputs(" with stdio.fast\n", stdout);
evalfile("fputs");
(void) fflush(stdout);
(void) putc('\n', stdout);
evalfile("putc 1");
(void) putc(' ', stdout);
evalfile("putc 2");
(void) putc('\n', stdout);
evalfile("putc 3");
(void) fflush(fp);
(void) fflush(stdout);
evalfile("fflush");
exit(status);
/* next line is not executed, but drags in the appropriate fread */
(void) fread(buf, 1, sizeof buf, stdin);
}
/* write on stdout without using stdio. ugh */
evalfile(s)
char *s;
{
static char ptr[] = "ptr ";
static char cnt[] = " cnt ";
static char *bufend = NULL;
static char buggered[] =
"Your stdio appears to be buggered: _ptr+_cnt does not yield a constant.\n";
static char negcnt[] = "_cnt can go negative.\n";
if (fp->_ptr != NULL && fp->_cnt != 0) {
if (fp->_cnt < 0) {
status = 1;
(void) write(1, negcnt, strlen(negcnt));
}
if (bufend == NULL)
bufend = (char *)fp->_ptr + fp->_cnt;
if (bufend != (char *)fp->_ptr + fp->_cnt) {
status = 1;
(void) write(1, buggered, strlen(buggered));
}
}
(void) write(1, s, strlen(s));
(void) write(1, "\t", 1);
(void) write(1, ptr, strlen(ptr));
prn((int)fp->_ptr, 10);
(void) write(1, cnt, strlen(cnt));
prn((int)fp->_cnt, 10);
(void) write(1, "\n", 1);
}
prn(i, rad)
int i, rad;
{
int quot, rem;
char c;
if (i < 0) {
(void) write(1, "-", 1);
i = -i;
}
quot = i / rad;
rem = i % rad;
if (quot > 0)
prn(quot, rad);
c = rem + '0';
(void) write(1, &c, 1);
}
syntax highlighted by Code2HTML, v. 0.9.1