Annotation of 42BSD/usr.lib/libI77/dfe.c, revision 1.1.1.1

1.1       root        1: /*
                      2: char id_dfe[] = "@(#)dfe.c     1.4";
                      3:  *
                      4:  * direct formatted external i/o
                      5:  */
                      6: 
                      7: #include "fio.h"
                      8: 
                      9: extern int rd_ed(),rd_ned(),w_ed(),w_ned();
                     10: int y_getc(),y_putc(),y_rnew(),y_wnew(),y_tab();
                     11: 
                     12: char rdfe[] = "read dfe";
                     13: char wdfe[] = "write dfe";
                     14: 
                     15: s_rdfe(a) cilist *a;
                     16: {
                     17:        int n;
                     18:        reading = YES;
                     19:        if(n=c_dfe(a,READ)) return(n);
                     20:        if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rdfe)
                     21:        getn = y_getc;
                     22:        doed = rd_ed;
                     23:        doned = rd_ned;
                     24:        dotab = y_tab;
                     25:        dorevert = doend = donewrec = y_rnew;
                     26:        if(pars_f(fmtbuf)) err(errflag,F_ERFMT,rdfe)
                     27:        fmt_bg();
                     28:        return(OK);
                     29: }
                     30: 
                     31: s_wdfe(a) cilist *a;
                     32: {
                     33:        int n;
                     34:        reading = NO;
                     35:        if(n=c_dfe(a,WRITE)) return(n);
                     36:        curunit->uend = NO;
                     37:        if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wdfe)
                     38:        putn = y_putc;
                     39:        doed = w_ed;
                     40:        doned = w_ned;
                     41:        dotab = y_tab;
                     42:        dorevert = doend = donewrec = y_wnew;
                     43:        if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wdfe)
                     44:        fmt_bg();
                     45:        return(OK);
                     46: }
                     47: 
                     48: e_rdfe()
                     49: {
                     50:        en_fio();
                     51:        return(OK);
                     52: }
                     53: 
                     54: e_wdfe()
                     55: {
                     56:        en_fio();
                     57:        return(OK);
                     58: }
                     59: 
                     60: c_dfe(a,flag) cilist *a;
                     61: {      int n;
                     62:        sequential = NO;
                     63:        external = formatted = FORMATTED;
                     64:        lfname = NULL;
                     65:        elist = NO;
                     66:        cursor=scale=recpos=reclen=0;
                     67:        radix = 10;
                     68:        signit = YES;
                     69:        fmtbuf = a->cifmt;
                     70:        errflag = a->cierr;
                     71:        endflag = a->ciend;
                     72:        lunit = a->ciunit;
                     73:        if(not_legal(lunit)) err(errflag,F_ERUNIT,rdfe+5);
                     74:        curunit = &units[lunit];
                     75:        if(!curunit->ufd && (n=fk_open(flag,DIR,FMT,(ftnint)lunit)))
                     76:                err(errflag,n,rdfe+5)
                     77:        cf = curunit->ufd;
                     78:        elist = YES;
                     79:        lfname = curunit->ufnm;
                     80:        if(!curunit->ufmt) err(errflag,F_ERNOFIO,rdfe+5)
                     81:        if(!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,rdfe+5)
                     82:        recnum = a->cirec - 1;
                     83:        fseek(cf, (long)curunit->url * recnum, 0);
                     84:        cblank = curunit->ublnk;
                     85:        cplus = NO;
                     86:        return(OK);
                     87: }
                     88: 
                     89: y_getc()
                     90: {
                     91:        int ch;
                     92:        if(curunit->uend) return(EOF);
                     93:        if(curunit->url==1 || recpos++ < curunit->url)
                     94:        {
                     95:                if((ch=getc(cf))!=EOF)
                     96:                {
                     97:                                return(ch);
                     98:                }
                     99:                if(feof(cf))
                    100:                {
                    101:                        curunit->uend = YES;
                    102:                        return(EOF);
                    103:                }
                    104:                err(errflag,errno,rdfe);
                    105:        }
                    106:        else return(' ');
                    107: }
                    108: 
                    109: y_putc(c)
                    110: {
                    111:        if(curunit->url!=1 && recpos++ >= curunit->url) err(errflag,F_EREREC,wdfe)
                    112:        putc(c,cf);
                    113:        return(OK);
                    114: }
                    115: 
                    116: y_tab()
                    117: {      int n;
                    118:        if(curunit->url==1)
                    119:        {
                    120:                if(cursor < 0 && -cursor > ftell(cf)) rewind(cf);
                    121:                else    fseek(cf,(long)cursor,1);
                    122:                return(cursor=0);
                    123:        }
                    124:        else
                    125:        {       if(reclen < recpos) reclen = recpos;
                    126:                if((recpos + cursor) < 0) cursor = -recpos;     /* BOR */
                    127:                n = reclen - recpos;            /* n >= 0 */
                    128:                if(!reading && (cursor-n) > 0)
                    129:                {       recpos = reclen;
                    130:                        cursor -= n;
                    131:                        fseek(cf,(long)n,1);
                    132:                        while(cursor--) if(n=(*putn)(' ')) return(n);
                    133:                        return(cursor=0);
                    134:                }
                    135:                recpos += cursor;
                    136:                if(recpos >= curunit->url) err(errflag,F_EREREC,rdfe+5)
                    137:        }
                    138:        fseek(cf,(long)cursor,1);
                    139:        return(cursor=0);
                    140: }
                    141: 
                    142: /*
                    143: /*y_rev()
                    144: /*{    /*what about work done?*/
                    145: /*     if(curunit->url==1) return(0);
                    146: /*     while(recpos<curunit->url) (*putn)(' ');
                    147: /*     recpos=0;
                    148: /*     return(0);
                    149: /*}
                    150: /*
                    151: /*y_err()
                    152: /*{
                    153: /*     err(errflag, F_EREREC, rdfe+5);
                    154: /*}
                    155: */
                    156: 
                    157: y_rnew()
                    158: {      if(curunit->url != 1)
                    159:        {       fseek(cf,(long)curunit->url*(++recnum),0);
                    160:                recpos = reclen = cursor = 0;
                    161:        }
                    162:        return(OK);
                    163: }
                    164: 
                    165: y_wnew()
                    166: {      if(curunit->url != 1)
                    167:        {       if(reclen > recpos)
                    168:                {       fseek(cf,(long)(reclen-recpos),1);
                    169:                        recpos = reclen;
                    170:                }
                    171:                while(recpos < curunit->url) (*putn)(' ');
                    172:                recnum++;
                    173:                recpos = reclen = cursor = 0;
                    174:        }
                    175:        return(OK);
                    176: }
                    177: 
                    178: y_rend()
                    179: {
                    180:        return(OK);
                    181: }
                    182: 
                    183: y_wend()
                    184: {
                    185:        return(y_wnew());
                    186: }

unix.superglobalmegacorp.com

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