Annotation of lucent/sys/src/cmd/rc/io.c, revision 1.1.1.1

1.1       root        1: #include "rc.h"
                      2: #include "exec.h"
                      3: #include "io.h"
                      4: #include "fns.h"
                      5: #include "stdarg.h"
                      6: int pfmtnest=0;
                      7: void pfmt(io *f, char *fmt, ...){
                      8:        va_list ap;
                      9:        va_start(ap, fmt);
                     10:        pfmtnest++;
                     11:        for(;*fmt;fmt++)
                     12:                if(*fmt!='%') pchr(f, *fmt);
                     13:                else switch(*++fmt){
                     14:                case '\0': va_end(ap); return;
                     15:                case 'c': pchr(f, va_arg(ap, int)); break;
                     16:                case 'd': pdec(f, va_arg(ap, int)); break;
                     17:                case 'o': poct(f, va_arg(ap, unsigned)); break;
                     18:                case 'p': phex(f, (long)va_arg(ap, char *)); break; /*unportable*/
                     19:                case 'Q': pquo(f, va_arg(ap, char *)); break;
                     20:                case 'q': pwrd(f, va_arg(ap, char *)); break;
                     21:                case 's': pstr(f, va_arg(ap, char *)); break;
                     22:                case 't': pcmd(f, va_arg(ap, struct tree *)); break;
                     23:                case 'v': pval(f, va_arg(ap, struct word *)); break;
                     24:                default: pchr(f, *fmt); break;
                     25:                }
                     26:        va_end(ap);
                     27:        if(--pfmtnest==0) flush(f);
                     28: }
                     29: void pquo(io *f, char *s)
                     30: {
                     31:        pchr(f, '\'');
                     32:        for(;*s;s++)
                     33:                if(*s=='\'') pfmt(f, "''");
                     34:                else pchr(f, *s);
                     35:        pchr(f, '\'');
                     36: }
                     37: void pwrd(io *f, char *s)
                     38: {
                     39:        char *t;
                     40:        for(t=s;*t;t++) if(!wordchr(*t)) break;
                     41:        if(t==s || *t) pquo(f, s);
                     42:        else pstr(f, s);
                     43: }
                     44: void phex(io *f, long p)
                     45: {
                     46:        int n;
                     47:        for(n=28;n>=0;n-=4) pchr(f, "0123456789ABCDEF"[(p>>n)&0xF]);
                     48: }
                     49: void pstr(io *f, char *s)
                     50: {
                     51:        if(s==0) s="(null)";
                     52:        while(*s) pchr(f, *s++);
                     53: }
                     54: void pdec(io *f, long n)
                     55: {
                     56:        if(n<0){
                     57:                n=-n;
                     58:                if(n>=0){
                     59:                        pchr(f, '-');
                     60:                        pdec(f, n);
                     61:                        return;
                     62:                }
                     63:                /* n is two's complement minimum integer */
                     64:                n=1-n;
                     65:                pchr(f, '-');
                     66:                pdec(f, n/10);
                     67:                pchr(f, n%10+'1');
                     68:                return;
                     69:        }
                     70:        if(n>9) pdec(f, n/10);
                     71:        pchr(f, n%10+'0');
                     72: }
                     73: void poct(io *f, ulong n)
                     74: {
                     75:        if(n>7) poct(f, n>>3);
                     76:        pchr(f, (n&7)+'0');
                     77: }
                     78: void pval(io *f, word *a)
                     79: {
                     80:        if(a){
                     81:                while(a->next && a->next->word){
                     82:                        pwrd(f, a->word);
                     83:                        pchr(f, ' ');
                     84:                        a=a->next;
                     85:                }
                     86:                pwrd(f, a->word);
                     87:        }
                     88: }
                     89: int fullbuf(io *f, int c)
                     90: {
                     91:        flush(f);
                     92:        return *f->bufp++=c;
                     93: }
                     94: void flush(io *f)
                     95: {
                     96:        int n;
                     97:        char *s;
                     98:        if(f->strp){
                     99:                n=f->ebuf-f->strp;
                    100:                f->strp=realloc(f->strp, n+101);
                    101:                if(f->strp==0) panic("Can't realloc %d bytes in flush!", n+101);
                    102:                f->bufp=f->strp+n;
                    103:                f->ebuf=f->bufp+100;
                    104:                for(s=f->bufp;s<=f->ebuf;s++) *s='\0';
                    105:        }
                    106:        else{
                    107:                n=f->bufp-f->buf;
                    108:                if(n && Write(f->fd, f->buf, n) < 0){
                    109:                        Write(3, "Write error\n", 12);
                    110:                        if(ntrap) dotrap();
                    111:                }
                    112:                f->bufp=f->buf;
                    113:                f->ebuf=f->buf+NBUF;
                    114:        }
                    115: }
                    116: io *openfd(int fd){
                    117:        io *f=new(struct io);
                    118:        f->fd=fd;
                    119:        f->bufp=f->ebuf=f->buf;
                    120:        f->strp=0;
                    121:        return f;
                    122: }
                    123: io *openstr(void){
                    124:        io *f=new(struct io);
                    125:        char *s;
                    126:        f->fd=-1;
                    127:        f->bufp=f->strp=emalloc(101);
                    128:        f->ebuf=f->bufp+100;
                    129:        for(s=f->bufp;s<=f->ebuf;s++) *s='\0';
                    130:        return f;
                    131: }
                    132: /*
                    133:  * Open a corebuffer to read.  EOF occurs after reading len
                    134:  * characters from buf.
                    135:  */
                    136: io *opencore(char *s, int len)
                    137: {
                    138:        io *f=new(struct io);
                    139:        char *buf=emalloc(len);
                    140:        f->fd= -1 /*open("/dev/null", 0)*/;
                    141:        f->bufp=f->strp=buf;
                    142:        f->ebuf=buf+len;
                    143:        Memcpy(buf, s, len);
                    144:        return f;
                    145: }
                    146: rewind(io *io)
                    147: {
                    148:        if(io->fd==-1) io->bufp=io->strp;
                    149:        else{
                    150:                io->bufp=io->ebuf=io->buf;
                    151:                Seek(io->fd, 0L, 0);
                    152:        }
                    153: }
                    154: void closeio(io *io)
                    155: {
                    156:        if(io->fd>=0) close(io->fd);
                    157:        if(io->strp) efree(io->strp);
                    158:        efree((char *)io);
                    159: }
                    160: int emptybuf(io *f)
                    161: {
                    162:        int n;
                    163:        if(f->fd==-1 || (n=Read(f->fd, f->buf, NBUF))<=0) return EOF;
                    164:        f->bufp=f->buf;
                    165:        f->ebuf=f->buf+n;
                    166:        return *f->bufp++&0xff;
                    167: }

unix.superglobalmegacorp.com

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