Annotation of 41BSD/lib/libI77uc/sfe.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * sequential formatted external routines
                      3:  */
                      4: 
                      5: #include "fio.h"
                      6: 
                      7: /*
                      8:  * read sequential formatted external
                      9:  */
                     10: 
                     11: extern int rd_ed(),rd_ned();
                     12: int x_rnew(),x_getc(),x_tab();
                     13: 
                     14: s_rsfe(a) cilist *a; /* start */
                     15: {      int n;
                     16:        reading = YES;
                     17:        if(n=c_sfe(a,READ)) return(n);
                     18:        if(curunit->uwrt) nowreading(curunit);
                     19:        getn= x_getc;
                     20:        doed= rd_ed;
                     21:        doned= rd_ned;
                     22:        donewrec = dorevert = doend = x_rnew;
                     23:        dotab = x_tab;
                     24:        if(pars_f(fmtbuf)) err(errflag,100,"read sfe")
                     25:        fmt_bg();
                     26:        return(OK);
                     27: }
                     28: 
                     29: x_rnew()                       /* find next record */
                     30: {      int ch;
                     31:        if(!curunit->uend)
                     32:                while((ch=getc(cf))!='\n' && ch!=EOF);
                     33:        cursor=recpos=reclen=0;
                     34:        return(OK);
                     35: }
                     36: 
                     37: x_getc()
                     38: {      int ch;
                     39:        if(curunit->uend) return(EOF);
                     40:        if((ch=getc(cf))!=EOF && ch!='\n')
                     41:        {       recpos++;
                     42:                return(ch);
                     43:        }
                     44:        if(ch=='\n')
                     45:        {       ungetc(ch,cf);
                     46:                return(ch);
                     47:        }
                     48:        if(feof(cf)) curunit->uend = YES;
                     49:        return(EOF);
                     50: }
                     51: 
                     52: e_rsfe()
                     53: {      int n;
                     54:        n=en_fio();
                     55:        fmtbuf=NULL;
                     56:        return(n);
                     57: }
                     58: 
                     59: c_sfe(a,flag) cilist *a; /* check */
                     60: {      unit *p;
                     61:        int n;
                     62:        external=sequential=formatted=FORMATTED;
                     63:        fmtbuf=a->cifmt;
                     64:        lfname = NULL;
                     65:        elist = NO;
                     66:        errflag = a->cierr;
                     67:        endflag = a->ciend;
                     68:        lunit = a->ciunit;
                     69:        if(not_legal(lunit)) err(errflag,101,"sfe");
                     70:        curunit = p = &units[lunit];
                     71:        if(!p->ufd && (n=fk_open(flag,SEQ,FMT,(ftnint)lunit)) )
                     72:                err(errflag,n,"sfe")
                     73:        cf = curunit->ufd;
                     74:        elist = YES;
                     75:        lfname = curunit->ufnm;
                     76:        if(!p->ufmt) err(errflag,102,"sfe")
                     77:        if(p->url) err(errflag,105,"sfe")
                     78:        cursor=recpos=scale=reclen=0;
                     79:        radix = 10;
                     80:        signit = YES;
                     81:        cblank = curunit->ublnk;
                     82:        cplus = NO;
                     83:        return(OK);
                     84: }
                     85: 
                     86: /*
                     87:  * write sequential formatted external
                     88:  */
                     89: 
                     90: extern int w_ed(),w_ned();
                     91: int x_putc(),pr_put(),x_wend(),x_wnew();
                     92: ioflag new;
                     93: 
                     94: s_wsfe(a) cilist *a;   /*start*/
                     95: {      int n;
                     96:        reading = NO;
                     97:        if(n=c_sfe(a,WRITE)) return(n);
                     98:        if(!curunit->uwrt) nowwriting(curunit);
                     99:        curunit->uend = NO;
                    100:        if (curunit->uprnt) putn = pr_put;
                    101:        else putn = x_putc;
                    102:        new = YES;
                    103:        doed= w_ed;
                    104:        doned= w_ned;
                    105:        doend = x_wend;
                    106:        dorevert = donewrec = x_wnew;
                    107:        dotab = x_tab;
                    108:        if(pars_f(fmtbuf)) err(errflag,100,"write sfe")
                    109:        fmt_bg();
                    110:        return(OK);
                    111: }
                    112: 
                    113: x_putc(c)
                    114: {
                    115:        if(c=='\n') recpos = reclen = cursor = 0;
                    116:        else recpos++;
                    117:        if (c) putc(c,cf);
                    118:        return(OK);
                    119: }
                    120: 
                    121: pr_put(c)
                    122: {
                    123:        if(c=='\n')
                    124:        {       new = YES;
                    125:                recpos = reclen = cursor = 0;
                    126:        }
                    127:        else if(new)
                    128:        {       new = NO;
                    129:                if(c=='0') c = '\n';
                    130:                else if(c=='1') c = '\f';
                    131:                else return(OK);
                    132:        }
                    133:        else recpos++;
                    134:        if (c) putc(c,cf);
                    135:        return(OK);
                    136: }
                    137: 
                    138: x_tab()
                    139: {      int n;
                    140:        if(reclen < recpos) reclen = recpos;
                    141:        if(curunit->useek)
                    142:        {       if((recpos+cursor) < 0) return(107);
                    143:                n = reclen - recpos;    /* distance to eor, n>=0 */
                    144:                if((cursor-n) > 0)
                    145:                {       fseek(cf,(long)n,1);  /* find current eor */
                    146:                        recpos = reclen;
                    147:                        cursor -= n;
                    148:                }
                    149:                else
                    150:                {       fseek(cf,(long)cursor,1);  /* do not pass go */
                    151:                        recpos += cursor;
                    152:                        return(cursor=0);
                    153:                }
                    154:        }
                    155:        else
                    156:                if(cursor < 0) return(120);     /* cant go back */
                    157:        while(cursor--)
                    158:        {       if(reading)
                    159:                {       n = (*getn)();
                    160:                        if(n=='\n')
                    161:                        {       (*ungetn)(n,cf);
                    162:                                return(110);
                    163:                        }
                    164:                        if(n==EOF) return(EOF);
                    165:                }
                    166:                else    (*putn)(' ');   /* fill in the empty record */
                    167:        }
                    168:        return(cursor=0);
                    169: }
                    170: 
                    171: x_wnew()
                    172: {
                    173:        if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
                    174:        return((*putn)('\n'));
                    175: }
                    176: 
                    177: x_wend(last) char last;
                    178: {
                    179:        if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
                    180:        return((*putn)(last));
                    181: }
                    182: 
                    183: /*
                    184: /*xw_rev()
                    185: /*{
                    186: /*     if(workdone) x_wSL();
                    187: /*     return(workdone=0);
                    188: /*}
                    189: /*
                    190: */
                    191: e_wsfe()
                    192: {      return(e_rsfe()); }

unix.superglobalmegacorp.com

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