Annotation of researchv9/cmd/p/pad.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.