Annotation of OpenXM_contrib2/asir2000/parse/stdio.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/parse/stdio.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
2: #include <stdio.h>
3: #include <stdlib.h>
4: #include <string.h>
5: #include <stdarg.h>
6: #include "w_stdio.h"
7:
8: static struct w_buf {
9: int inlen, inpos;
10: int outpos;
11: char inbuf[2*BUFSIZ];
12: char outbuf[2*BUFSIZ];
13: } W_BUF;
14:
15: static int noflush;
16:
17: #define INBUF_EMPTY (W_BUF.inpos >= W_BUF.inlen)
18:
19: int w_filbuf(void)
20: {
21: int status = get_line(W_BUF.inbuf);
22: W_BUF.inpos = 0;
23: W_BUF.inlen = strlen(W_BUF.inbuf);
24: return status;
25: }
26:
27: int w_flushbuf(void) {
28: W_BUF.outbuf[W_BUF.outpos] = 0;
29: W_BUF.outpos = 0;
30: put_line(W_BUF.outbuf);
31: return 0;
32: }
33:
34: int w_fflush(FILE *file)
35: {
36: if ( file == stdout || file == stderr )
37: return w_flushbuf();
38: else
39: return fflush(file);
40: }
41:
42: void w_noflush_stderr(int flag)
43: {
44: noflush = flag;
45: }
46:
47: int get_char(void)
48: {
49: int status = 0;
50:
51: if ( INBUF_EMPTY )
52: status = w_filbuf();
53: if ( status )
54: return EOF;
55: else
56: return (int)W_BUF.inbuf[W_BUF.inpos++];
57: }
58:
59: char *get_string(char *s, int n)
60: {
61: int i;
62: char *p;
63: int status = 0;
64:
65: if ( INBUF_EMPTY )
66: status = w_filbuf();
67: if ( status )
68: return NULL;
69: for ( i = 0, p = s; i < n && !INBUF_EMPTY && W_BUF.inbuf[i]; i++ )
70: *p++ = W_BUF.inbuf[W_BUF.inpos++];
71: if ( i < n )
72: *p = 0;
73: return s;
74: }
75:
76: int w_fgetc(FILE *file)
77: {
78: if ( file == stdin )
79: return get_char();
80: else
81: return fgetc(file);
82: }
83:
84: int unget_char(int c)
85: {
86: W_BUF.inbuf[--W_BUF.inpos] = (char )c;
87: return c;
88: }
89:
90: int put_char(int c,FILE *file)
91: {
92: static char s[2];
93:
94: s[0] = (char)c;
95: put_string(s,file);
96: return c;
97: }
98:
99: int put_string(char *s,FILE *file)
100: {
101: char c;
102:
103: while ( 1 ) {
104: for ( ; (c = *s) && W_BUF.outpos < BUFSIZ; s++ ) {
105: W_BUF.outbuf[W_BUF.outpos++] = c;
106: if ( c == '\n' ) {
107: W_BUF.outbuf[W_BUF.outpos-1] = '\r';
108: W_BUF.outbuf[W_BUF.outpos++] = '\n';
109: w_flushbuf();
110: }
111: }
112: if ( !c )
113: break;
114: else if ( W_BUF.outpos == BUFSIZ )
115: w_flushbuf();
116: }
117: if (file == stderr && !noflush)
118: w_flushbuf();
119: return 0;
120: }
121:
122: char *w_fgets(char *s,int n, FILE *file)
123: {
124: if ( file == stdin )
125: return get_string(s,n);
126: else
127: return fgets(s,n,file);
128: }
129:
130: int w_ungetc(int c, FILE *file)
131: {
132: if ( file == stdin )
133: return unget_char(c);
134: else
135: return ungetc(c,file);
136: }
137:
138: int w_fputc(int c, FILE *file)
139: {
140: if ( file == stdout || file == stderr )
141: return put_char(c,file);
142: else
143: return fputc(c,file);
144: }
145:
146: int w_fputs(char *s, FILE *file)
147: {
148: int status;
149:
150: if ( file == stdout || file == stderr )
151: return put_string(s,file);
152: else
153: return fputs(s,file);
154: }
155:
156: int w_printf(char *format, ...)
157: {
158: va_list ap;
159: int status;
160: char buf[BUFSIZ];
161:
162: va_start(ap,format);
163: status = vsprintf(buf,format,ap);
164: put_string(buf,stdout);
165: return status;
166: }
167:
168: int w_fprintf(FILE *file, char *format, ...)
169: {
170: va_list ap;
171: int status;
172: char buf[BUFSIZ];
173:
174: va_start(ap,format);
175: if ( file == stdout || file == stderr ) {
176: status = vsprintf(buf,format,ap);
177: put_string(buf,file);
178: } else {
179: status = vfprintf(file,format,ap);
180: }
181: va_end(ap);
182: return status;
183: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>