Annotation of researchv8dc/cmd/p/pad.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "pad.h"
        !             3: #define        NPCBL   8       /* Number of entries in the circular list */
        !             4: 
        !             5: PAD *
        !             6: Pfopen(f)
        !             7:        FILE *f;
        !             8: {
        !             9:        register PAD *p=NULL;
        !            10:        register i;
        !            11:        if(f!=NULL && (p=(PAD *)malloc(sizeof (PAD)))!=NULL){
        !            12:                p->Pcbl=(_PCBL *)malloc(NPCBL*sizeof(_PCBL));
        !            13:                if(p->Pcbl==NULL){
        !            14:                        free(p);
        !            15:                        return(NULL);
        !            16:                }
        !            17:                for(i=0; i<NPCBL; i++){
        !            18:                        p->Pcbl[i].Pnextp= &p->Pcbl[(i+1)%NPCBL];
        !            19:                        p->Pcbl[(i+1)%NPCBL].Pprevp= &p->Pcbl[i];
        !            20:                        p->Pcbl[i].Pbase=NULL;
        !            21:                        p->Pcbl[i].Phiwat=NULL;
        !            22:                }
        !            23:                p->Pfile=f;
        !            24:                f->_cnt=0;      /* To be safe */
        !            25:                f->_flag|=_IOREAD;
        !            26:        }
        !            27:        return(p);
        !            28: }
        !            29: 
        !            30: int
        !            31: _Pfilbuf(p)
        !            32: register PAD *p;
        !            33: {
        !            34:        register _PCBL *pcbl;
        !            35:        register FILE *f;
        !            36: 
        !            37:        pcbl = p->Pcbl;
        !            38:        f = p->Pfile;
        !            39:        if ((f->_flag & _IOREAD) == 0 || f->_flag & _IOSTRG)
        !            40:                return (EOF);
        !            41: 
        !            42:        /*
        !            43:         * if this buffer is full, use next one
        !            44:         */
        !            45:        if (pcbl->Phiwat >= pcbl->Pbase + BUFSIZ) {
        !            46:                p->Pcbl = pcbl = pcbl->Pnextp;
        !            47:                f->_base = f->_ptr = pcbl->Pbase;
        !            48:                f->_cnt = pcbl->Phiwat - pcbl->Pbase;
        !            49:                }
        !            50: 
        !            51:        if (pcbl->Pbase == NULL) {
        !            52:                if ((pcbl->Pbase = (char *) malloc(BUFSIZ)) == NULL) {
        !            53:                        fprintf(stderr,"pad: can't malloc\n");  /* ? */
        !            54:                        f->_flag |= _IOERR;
        !            55:                        return (EOF);
        !            56:                        }
        !            57:                pcbl->Phiwat = f->_base = pcbl->Pbase;
        !            58:                f->_flag |= _IOMYBUF;
        !            59:                }
        !            60: 
        !            61:        /*
        !            62:         * if no more saved characters in this buffer,
        !            63:         * read some new ones
        !            64:         */
        !            65:        if (f->_cnt <= 0) {
        !            66:                f->_ptr = pcbl->Phiwat;
        !            67:                f->_cnt = read(fileno(f),f->_ptr,(pcbl->Pbase + BUFSIZ) - f->_ptr);
        !            68:                if (f->_cnt > 0) {
        !            69:                        pcbl->Phiwat += f->_cnt;
        !            70:                        pcbl->Pnextp->Phiwat = pcbl->Pnextp->Pbase;
        !            71:                        }
        !            72:                }
        !            73: 
        !            74:        if (--f->_cnt < 0) {
        !            75:                f->_flag |= (f->_cnt == -1 ? _IOEOF : _IOERR);
        !            76:                f->_cnt = 0;
        !            77:                return (EOF);
        !            78:                }
        !            79:        return (*f->_ptr++);
        !            80: }
        !            81: 
        !            82: Pclose(p)
        !            83:        register PAD *p;
        !            84: {
        !            85:        register i;
        !            86:        register _PCBL *pcbl=p->Pcbl;
        !            87:        register _PCBL *old;
        !            88:        for(i=0; i<NPCBL; i++){
        !            89:                if(pcbl->Pbase)
        !            90:                        free(pcbl->Pbase);
        !            91:                old=pcbl;
        !            92:                pcbl=pcbl->Pnextp;
        !            93:                free(old);
        !            94:        }
        !            95:        fclose(p->Pfile);
        !            96:        free(p);
        !            97: }
        !            98: 
        !            99: int
        !           100: Pbackc(p)
        !           101:        register PAD *p;
        !           102: {
        !           103:        register _PCBL *pcbl;
        !           104:        register FILE *f;
        !           105:        f=p->Pfile;
        !           106:        pcbl=p->Pcbl;
        !           107:        ++f->_cnt;
        !           108:        if(--f->_ptr < pcbl->Pbase){
        !           109:                pcbl=pcbl->Pprevp;              /* Only local... */
        !           110:                if(pcbl->Phiwat <= pcbl->Pbase){
        !           111:                        --f->_cnt;
        !           112:                        ++f->_ptr;
        !           113:                        return(EOF);
        !           114:                }
        !           115:                p->Pcbl=pcbl;                   /* ...until now */
        !           116:                f->_ptr=pcbl->Phiwat-1;
        !           117:                f->_cnt=1;
        !           118:        }
        !           119:        return(*f->_ptr);
        !           120: }
        !           121: 

unix.superglobalmegacorp.com

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