YAP 7.1.0
ypstdio.c
1/*************************************************************************
2* *
3* YAP Prolog %W% %G%
4* *
5* Yap Prolog was developed at NCCUP - Universidade do Porto *
6* *
7* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
8* *
9**************************************************************************
10* *
11* File: io.h *
12* Last rev: 19/2/88 *
13* mods: *
14* comments: simple replacement for stdio *
15* *
16*************************************************************************/
17
18#include "Yap.h"
19
20#ifdef YAP_STDIO
21
22#include <malloc.h>
23
24#if HAVE_FCNTL_H
25#include <fcntl.h>
26#endif
27#if HAVE_UNISTD_H
28#include <unistd.h>
29#endif
30#if WINDOWS
31#include <io.h>
32#endif
33#include <stdarg.h>
34
35#ifndef O_BINARY
36#define O_BINARY 0
37#endif
38
39YP_FILE yp_iob[YP_MAX_FILES];
40
41static void
42clear_iob(YP_FILE *f)
43{
44 f->flags = f->cnt = 0;
45 f->buflen = 1;
46 f->ptr = f->base = (char *) &f->buf;
47 f->close = close;
48 f->read = read;
49 f->write = write;
50}
51
52void
53init_yp_stdio()
54{
55 int i;
56 /* mark all descriptors as free */
57 for(i=0; i<YP_MAX_FILES; ++i) {
58 yp_iob[i].check = i;
59 clear_iob(&yp_iob[i]);
60 }
61 /* initialize standard ones */
62 yp_iob[0].fd = 0;
63 yp_iob[0].flags = _YP_IO_FILE | _YP_IO_READ;
64 yp_iob[1].fd = 1;
65 yp_iob[1].flags = _YP_IO_FILE | _YP_IO_WRITE;
66 yp_iob[2].fd = 2;
67 yp_iob[2].flags = _YP_IO_FILE | _YP_IO_WRITE;
68}
69
70int
71YP_fillbuf(YP_FILE *f)
72{
73 if (!(f->flags & _YP_IO_READ)||(f->flags & (_YP_IO_ERR|_YP_IO_EOF)))
74 return -1;
75 if ((f->cnt = (f->read)(f->fd,f->base,f->buflen)) < 0) {
76 f->flags |= _YP_IO_ERR;
77 return -1;
78 }
79 if (f->cnt==0) {
80 f->flags |= _YP_IO_EOF;
81 return -1;
82 }
83 f->ptr = f->base;
84 return YP_getc(f);
85}
86
87
88int
89YP_flushbuf(int c,YP_FILE *f)
90{
91 if(!(f->flags & _YP_IO_WRITE)||(f->flags & _YP_IO_ERR)) return -1;
92 *(f->ptr++) = c;
93 {
94 int cnt = f->ptr-f->base;
95 int r = (f->write)(f->fd,f->base,cnt);
96 f->ptr = f->base;
97 if (r!=cnt) {
98 f->flags |= _YP_IO_ERR;
99 return -1;
100 }
101 f->ptr = f->base;
102 f->cnt = f->buflen-1;
103 }
104 return c;
105}
106
107int
108YP_fflush(YP_FILE *f)
109{
110 if(!(f->flags & _YP_IO_WRITE)||(f->flags & _YP_IO_ERR)) return -1;
111 if (f->ptr==f->base) return 0;
112 {
113 int cnt = f->ptr-f->base;
114 int r = (f->write)(f->fd,f->base,cnt);
115 f->ptr = f->base;
116 if (r!=cnt) {
117 f->flags |= _YP_IO_ERR;
118 return -1;
119 }
120 f->ptr = f->base;
121 f->cnt = f->buflen-1;
122 }
123 return 0;
124}
125
126int
127YP_fputs(char *s, YP_FILE *f)
128{
129 int count = 0;
130 while (*s) {
131 if (putc(*s++,f)<0) return -1;
132 ++count;
133 }
134 return count;
135}
136
137int
138YP_puts(char *s)
139{
140 return YP_fputs(s,YP_stdout);
141}
142
143
144char *
145YP_fgets(char *s, int n, YP_FILE *f)
146{
147 char *p=s;
148 if (f->flags & _YP_IO_ERR) return 0;
149 while(--n) {
150 int ch = YP_getc(f);
151 if (ch<0) return 0;
152 *p++ = ch;
153 if (ch=='\n') break;
154 }
155 *p = 0;
156 return s;
157}
158
159char *
160YP_gets(char *s)
161{
162 char *p=s;
163 while(1) {
164 int ch = YP_getchar();
165 if (ch<0) return 0;
166 if (ch=='\n') break;
167 *p++ = ch;
168 }
169 *p = 0;
170 return s;
171}
172
173
174YP_FILE*
175YP_fopen(char *path, char *mode)
176{
177 YP_FILE *f = 0;
178 int i, fd, flags, ch1, ch2;
179 for(i=3; i<YP_MAX_FILES; ++i)
180 if (!yp_iob[i].flags) {
181 f = &yp_iob[i];
182 break;
183 }
184 if (!f) return f;
185 /* try to open the file */
186 flags = 0;
187 ch1 = *mode++;
188 ch2 = *mode;
189 if(ch2=='b') {
190 flags = O_BINARY;
191 ch2 = *++mode;
192 }
193 if (ch2) return 0;
194 switch (ch1) {
195 case 'r':
196 flags |= O_RDONLY;
197 break;
198 case 'w':
199 flags |= O_WRONLY | O_TRUNC | O_CREAT;
200 break;
201 case 'a':
202 flags |= O_WRONLY | O_CREAT | O_APPEND;
203 break;
204 default:
205 return 0;
206 }
207 if ((fd=open(path,flags,0644))<0) return 0;
208 f->fd = fd;
209 f->flags = _YP_IO_FILE | (ch1=='r' ? _YP_IO_READ : _YP_IO_WRITE);
210 f->ptr = f->base;
211 /* todo: add buffers */
212 f->cnt = 0;
213 f->close = close;
214 f->read = read;
215 f->write = write;
216 return f;
217}
218
219int
220YP_fclose(YP_FILE *f)
221{
222 if (f != &yp_iob[f->check]) return -1;
223 if (f->flags & _YP_IO_WRITE) {
224 YP_fflush(f);
225 }
226 (f->close)(f->fd);
227 /* todo: release buffers */
228 clear_iob(f);
229 return 0;
230}
231
232
233#define MAXBSIZE 32768
234
235int
236YP_printf(char *format,...)
237{
238 va_list ap;
239 char *buf = (char *) alloca(MAXBSIZE);
240 int r;
241
242 va_start(ap,format);
243 vsprintf(buf,format,ap);
244 r = YP_puts(buf);
245
246 va_end(ap);
247
248 return r;
249}
250
251
252int
253YP_fprintf(YP_FILE *f, char *format,...)
254{
255 va_list ap;
256 char *buf = (char *) alloca(MAXBSIZE);
257 int r;
258
259 va_start(ap,format);
260 vsprintf(buf,format,ap);
261 r = YP_fputs(buf,f);
262
263 va_end(ap);
264
265 return r;
266}
267
268int
269YP_fileno(YP_FILE *f)
270{
271 return f->fd;
272}
273
274int
275YP_clearerr(YP_FILE *f)
276{
277 f->flags &= ~ _YP_IO_ERR | _YP_IO_EOF;
278 return 0;
279}
280
281int
282YP_feof(YP_FILE *f)
283{
284 return f->flags & _YP_IO_EOF ? 1 : 0;
285}
286
287int
288YP_setbuf(YP_FILE *f, char *b)
289{
290 return 0;
291}
292
293int
294YP_fseek(YP_FILE *f, int offset, int whence)
295{
296 /* todo: implement fseek */
297 return 0;
298}
299
300int
301YP_ftell(YP_FILE*f)
302{
303 return 0;
304}
305
306#endif /* YAP_STDIO */
307
Main definitions.