|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pad.h" ! 3: ! 4: char *malloc(); ! 5: ! 6: #define NPCBL 8 /* Number of entries in the circular list */ ! 7: ! 8: PAD * ! 9: Pfopen(f, m) ! 10: char *f, *m; ! 11: { ! 12: int fd; ! 13: PAD *p; ! 14: ! 15: if (*m != 'r') /* hack */ ! 16: return (NULL); ! 17: if ((fd = open(f, 0)) < 0) ! 18: return (NULL); ! 19: if ((p = Pfdopen(fd)) == NULL) ! 20: close(fd); ! 21: return (p); ! 22: } ! 23: ! 24: PAD * ! 25: Pfdopen(fd) ! 26: int fd; ! 27: { ! 28: register PAD *p; ! 29: register i; ! 30: ! 31: if ((p = (PAD *)malloc(sizeof(PAD))) == NULL) ! 32: return (NULL); ! 33: p->Pfile = fd; ! 34: p->Pcbl=(_PCBL *)malloc(NPCBL*sizeof(_PCBL)); ! 35: if(p->Pcbl==NULL){ ! 36: free((char *)p); ! 37: return (NULL); ! 38: } ! 39: p->Pcbb = p->Pcbl; ! 40: for(i=0; i<NPCBL; i++){ ! 41: p->Pcbl[i].Pnextp = &p->Pcbl[(i+1)%NPCBL]; ! 42: p->Pcbl[(i+1)%NPCBL].Pprevp = &p->Pcbl[i]; ! 43: p->Pcbl[i].Pbase = NULL; ! 44: p->Pcbl[i].Phiwat = NULL; ! 45: p->Pcbl[i].Pptr = NULL; ! 46: p->Pcbl[i].Pcnt = 0; ! 47: } ! 48: return (p); ! 49: } ! 50: ! 51: int ! 52: _Pfilbuf(p) ! 53: register PAD *p; ! 54: { ! 55: register _PCBL *pcbl; ! 56: ! 57: pcbl = p->Pcbl; ! 58: if (pcbl->Phiwat >= pcbl->Pbase + BUFSIZ) { ! 59: p->Pcbl = pcbl = pcbl->Pnextp; ! 60: if (pcbl->Pcnt <= 0) /* stale data */ ! 61: pcbl->Phiwat = pcbl->Pbase; ! 62: } ! 63: if (pcbl->Pbase == NULL) { ! 64: if ((pcbl->Pbase = (char *) malloc(BUFSIZ)) == NULL) { ! 65: fprintf(stderr, "pad: can't malloc\n"); /* ? */ ! 66: return (EOF); ! 67: } ! 68: pcbl->Phiwat = pcbl->Pbase; ! 69: } ! 70: if (pcbl->Pcnt <= 0) { ! 71: pcbl->Pptr = pcbl->Phiwat; ! 72: pcbl->Pcnt = read(p->Pfile, pcbl->Pptr, (pcbl->Pbase + BUFSIZ) - pcbl->Phiwat); ! 73: if (pcbl->Pcnt > 0) ! 74: pcbl->Phiwat += pcbl->Pcnt; ! 75: } ! 76: if (--pcbl->Pcnt < 0) { ! 77: pcbl->Pcnt = 0; ! 78: return (EOF); ! 79: } ! 80: return (*pcbl->Pptr++); ! 81: } ! 82: ! 83: Pclose(p) ! 84: register PAD *p; ! 85: { ! 86: register i; ! 87: ! 88: for(i=0; i<NPCBL; i++) ! 89: if (p->Pcbb[i].Pbase) ! 90: free(p->Pcbb[i].Pbase); ! 91: free((char *)p->Pcbb); ! 92: close(p->Pfile); ! 93: free((char *)p); ! 94: } ! 95: ! 96: int ! 97: Pbackc(p) ! 98: register PAD *p; ! 99: { ! 100: register _PCBL *pcbl; ! 101: ! 102: pcbl=p->Pcbl; ! 103: if(pcbl->Pptr <= pcbl->Pbase){ ! 104: pcbl=pcbl->Pprevp; /* Only local... */ ! 105: if(pcbl->Pptr <= pcbl->Pbase) ! 106: return(EOF); ! 107: p->Pcbl=pcbl; /* ...until now */ ! 108: pcbl->Pcnt = 0; ! 109: } ! 110: ++pcbl->Pcnt; ! 111: return(*--pcbl->Pptr); ! 112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.