fiss

Friedel's Initialization and Service Supervision
Log | Files | Refs | LICENSE

bgetc.c (959B)


      1 #include "lib9.h"
      2 
      3 #include <bio.h>
      4 
      5 int Bgetc(Biobuf* bp) {
      6 	int i;
      7 
      8 loop:
      9 	i = bp->icount;
     10 	if (i != 0) {
     11 		bp->icount = i + 1;
     12 		return bp->ebuf[i];
     13 	}
     14 	if (bp->state != Bractive) {
     15 		if (bp->state == Bracteof)
     16 			bp->state = Bractive;
     17 		return Beof;
     18 	}
     19 	/*
     20 	 * get next buffer, try to keep Bungetsize
     21 	 * characters pre-catenated from the previous
     22 	 * buffer to allow that many ungets.
     23 	 */
     24 	memmove(bp->bbuf - Bungetsize, bp->ebuf - Bungetsize, Bungetsize);
     25 	i        = read(bp->fid, bp->bbuf, bp->bsize);
     26 	bp->gbuf = bp->bbuf;
     27 	if (i <= 0) {
     28 		bp->state = Bracteof;
     29 		if (i < 0)
     30 			bp->state = Binactive;
     31 		return Beof;
     32 	}
     33 	if (i < bp->bsize) {
     34 		memmove(bp->ebuf - i - Bungetsize, bp->bbuf - Bungetsize, i + Bungetsize);
     35 		bp->gbuf = bp->ebuf - i;
     36 	}
     37 	bp->icount = -i;
     38 	bp->offset += i;
     39 	goto loop;
     40 }
     41 
     42 int Bungetc(Biobuf* bp) {
     43 
     44 	if (bp->state == Bracteof)
     45 		bp->state = Bractive;
     46 	if (bp->state != Bractive)
     47 		return Beof;
     48 	bp->icount--;
     49 	return 1;
     50 }