getinput.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       getinput.c (965B)
       ---
            1 
            2 #include <assert.h>
            3 #include <unistd.h>
            4 #include <errno.h>
            5 
            6 #include "libvxc/private.h"
            7 #include "ioprivate.h"
            8 
            9 
           10 static char stdinbuf[BUFSIZ];
           11 
           12 FILE __stdin = {STDIN_FILENO};
           13 
           14 
           15 // Prefetch some input data if possible,
           16 // allocating a new input buffer if necessary.
           17 // Assumes the input buffer is currently empty.
           18 int __getinput(FILE *f)
           19 {
           20         if (f->ibuf == NULL) {
           21                 // No input buffer at all (yet).
           22 
           23                 // Give stdin a static buffer,
           24                 // so that we can read stdin without pulling in malloc.
           25                 if (f == stdin) {
           26 
           27                         stdin->ibuf = stdinbuf;
           28                         stdin->imax = BUFSIZ;
           29 
           30                 } else {
           31 
           32                         // File must not be open for writing.
           33                         errno = EBADF;
           34                         f->errflag = 1;
           35                         return EOF;
           36                 }
           37         }
           38 
           39         // Update offset.
           40         f->ioffset += f->ilim;
           41         f->ipos = 0;
           42         f->ilim = 0;
           43 
           44         // Read some input data
           45         ssize_t rc = read(f->fd, f->ibuf, f->imax);
           46         if (rc < 0) {
           47                 f->errflag = 1;
           48                 return EOF;
           49         }
           50         if (rc == 0) {
           51                 f->eofflag = 1;
           52                 return EOF;
           53         }
           54 
           55         f->ipos = 0;
           56         f->ilim = rc;
           57         return 0;
           58 }
           59