/************************************************************************* * * * YAP Prolog %W% %G% * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: io.h * * Last rev: 19/2/88 * * mods: * * comments: simple replacement for stdio * * * *************************************************************************/ #include "Yap.h" #ifdef YAP_STDIO #include #if HAVE_FCNTL_H #include #endif #if HAVE_UNISTD_H #include #endif #if WINDOWS #include #endif #include #ifndef O_BINARY #define O_BINARY 0 #endif YP_FILE yp_iob[YP_MAX_FILES]; static void clear_iob(YP_FILE *f) { f->flags = f->cnt = 0; f->buflen = 1; f->ptr = f->base = (char *) &f->buf; f->close = close; f->read = read; f->write = write; } void init_yp_stdio() { int i; /* mark all descriptors as free */ for(i=0; iflags & _YP_IO_READ)||(f->flags & (_YP_IO_ERR|_YP_IO_EOF))) return -1; if ((f->cnt = (f->read)(f->fd,f->base,f->buflen)) < 0) { f->flags |= _YP_IO_ERR; return -1; } if (f->cnt==0) { f->flags |= _YP_IO_EOF; return -1; } f->ptr = f->base; return YP_getc(f); } int YP_flushbuf(int c,YP_FILE *f) { if(!(f->flags & _YP_IO_WRITE)||(f->flags & _YP_IO_ERR)) return -1; *(f->ptr++) = c; { int cnt = f->ptr-f->base; int r = (f->write)(f->fd,f->base,cnt); f->ptr = f->base; if (r!=cnt) { f->flags |= _YP_IO_ERR; return -1; } f->ptr = f->base; f->cnt = f->buflen-1; } return c; } int YP_fflush(YP_FILE *f) { if(!(f->flags & _YP_IO_WRITE)||(f->flags & _YP_IO_ERR)) return -1; if (f->ptr==f->base) return 0; { int cnt = f->ptr-f->base; int r = (f->write)(f->fd,f->base,cnt); f->ptr = f->base; if (r!=cnt) { f->flags |= _YP_IO_ERR; return -1; } f->ptr = f->base; f->cnt = f->buflen-1; } return 0; } int YP_fputs(char *s, YP_FILE *f) { int count = 0; while (*s) { if (putc(*s++,f)<0) return -1; ++count; } return count; } int YP_puts(char *s) { return YP_fputs(s,YP_stdout); } char * YP_fgets(char *s, int n, YP_FILE *f) { char *p=s; if (f->flags & _YP_IO_ERR) return 0; while(--n) { int ch = YP_getc(f); if (ch<0) return 0; *p++ = ch; if (ch=='\n') break; } *p = 0; return s; } char * YP_gets(char *s) { char *p=s; while(1) { int ch = YP_getchar(); if (ch<0) return 0; if (ch=='\n') break; *p++ = ch; } *p = 0; return s; } YP_FILE* YP_fopen(char *path, char *mode) { YP_FILE *f = 0; int i, fd, flags, ch1, ch2; for(i=3; ifd = fd; f->flags = _YP_IO_FILE | (ch1=='r' ? _YP_IO_READ : _YP_IO_WRITE); f->ptr = f->base; /* todo: add buffers */ f->cnt = 0; f->close = close; f->read = read; f->write = write; return f; } int YP_fclose(YP_FILE *f) { if (f != &yp_iob[f->check]) return -1; if (f->flags & _YP_IO_WRITE) { YP_fflush(f); } (f->close)(f->fd); /* todo: release buffers */ clear_iob(f); return 0; } #define MAXBSIZE 32768 int YP_printf(char *format,...) { va_list ap; char *buf = (char *) alloca(MAXBSIZE); int r; va_start(ap,format); vsprintf(buf,format,ap); r = YP_puts(buf); va_end(ap); return r; } int YP_fprintf(YP_FILE *f, char *format,...) { va_list ap; char *buf = (char *) alloca(MAXBSIZE); int r; va_start(ap,format); vsprintf(buf,format,ap); r = YP_fputs(buf,f); va_end(ap); return r; } int YP_fileno(YP_FILE *f) { return f->fd; } int YP_clearerr(YP_FILE *f) { f->flags &= ~ _YP_IO_ERR | _YP_IO_EOF; return 0; } int YP_feof(YP_FILE *f) { return f->flags & _YP_IO_EOF ? 1 : 0; } int YP_setbuf(YP_FILE *f, char *b) { return 0; } int YP_fseek(YP_FILE *f, int offset, int whence) { /* todo: implement fseek */ return 0; } int YP_ftell(YP_FILE*f) { return 0; } #endif /* YAP_STDIO */