Annotation of researchv10no/cmd/mk/src/quote.c, revision 1.1.1.1

1.1       root        1: #include       "mk.h"
                      2: 
                      3: /*
                      4:        quoted stuff gets EBIT
                      5: */
                      6: 
                      7: static
                      8: squote(fd, srcp, destp)
                      9:        char **srcp, **destp;
                     10: {
                     11:        register char *src = *srcp, *dest = *destp;
                     12: 
                     13:        while(*src != '\''){
                     14:                if(*src == 0){
                     15:                        char *s;
                     16: 
                     17:                        if(s = Frdline(fd)){
                     18:                                inline++;
                     19:                                *dest++ = '\n'|EBIT;
                     20:                                strcpy(src, s);
                     21:                                continue;
                     22:                        } else {
                     23:                                SYNERR(-1); Fprint(2, "missing closing '\n");
                     24:                                break;
                     25:                        }
                     26:                }
                     27:                *dest++ = *src++|EBIT;
                     28:        }
                     29:        *dest = 0;
                     30:        if(*src)
                     31:                src++;
                     32:        *srcp = src;
                     33:        *destp = dest;
                     34: }
                     35: 
                     36: static
                     37: dquote(fd, src, dest)
                     38:        char **src, **dest;
                     39: {
                     40:        char *p = *src, *s = *dest;
                     41:        char *t, carry;
                     42:        Symtab *sym;
                     43: 
                     44:        while(*p != '"'){
                     45:                switch(*p)
                     46:                {
                     47:                case 0:
                     48:                        if(t = Frdline(fd)){
                     49:                                inline++;
                     50:                                *s++ = '\n'|EBIT;
                     51:                                strcpy(p, t);
                     52:                                continue;
                     53:                        } else {
                     54:                                SYNERR(-1); Fprint(2, "missing closing \"\n");
                     55:                                break;
                     56:                        }
                     57:                        break;
                     58:                case '\\':
                     59:                        switch(*++p)
                     60:                        {
                     61:                        default:
                     62:                                *s++ = '\\'|EBIT;
                     63:                        case '\\': case '"':
                     64:                        case '\'': case '$':
                     65:                                *s++ = *p|EBIT;
                     66:                        }
                     67:                        p++;
                     68:                        break;
                     69:                case '$':
                     70:                        varsub(&p, &s, EBIT);
                     71:                        break;
                     72:                default:
                     73:                        *s++ = *p++|EBIT;
                     74:                }
                     75:        }
                     76:        *s = 0;
                     77:        if(*p)
                     78:                p++;
                     79:        *src = p;
                     80:        *dest = s;
                     81: }
                     82: 
                     83: quote1(fd, src, dest)
                     84:        char *src, *dest;
                     85: {
                     86:        char *t;
                     87: 
                     88:        while(*src){
                     89:                switch(*src)
                     90:                {
                     91:                case '\'':
                     92:                        src++;
                     93:                        squote(fd, &src, &dest);
                     94:                        break;
                     95:                case '\\':
                     96:                        if(src[1]){
                     97:                                *dest++ = *++src | EBIT;
                     98:                                src++;
                     99:                        } else if(t = Frdline(fd)){
                    100:                                inline++;
                    101:                                strcpy(src, t);
                    102:                        }
                    103:                        break;
                    104:                default:
                    105:                        *dest++ = *src++;
                    106:                }
                    107:        }
                    108:        *dest = 0;
                    109: }
                    110: 
                    111: quote2(fd, src, dest)
                    112:        char *src, *dest;
                    113: {
                    114:        char *t;
                    115: 
                    116:        while(*src){
                    117:                switch(*src)
                    118:                {
                    119:                case '"':
                    120:                        src++;
                    121:                        dquote(fd, &src, &dest);
                    122:                        break;
                    123:                case '\\':
                    124:                        if(src[1]){
                    125:                                *dest++ = *++src;
                    126:                                src++;
                    127:                        } else if(t = Frdline(fd)){
                    128:                                inline++;
                    129:                                strcpy(src, t);
                    130:                        }
                    131:                        break;
                    132:                case '$':
                    133:                        varsub(&src, &dest, 0);
                    134:                        break;
                    135:                default:
                    136:                        *dest++ = *src++;
                    137:                }
                    138:        }
                    139:        *dest = 0;
                    140: }
                    141: 
                    142: static char *
                    143: subsub(val, ext, dest, bit)
                    144:        char *val, *ext, *dest;
                    145: {
                    146:        register char *s;
                    147:        char *a, *b, *c, *d;
                    148:        int na, nb, nc, nd, n;
                    149:        int destsub = 0;
                    150: 
                    151:        /* prepare literals */
                    152:        a = s = ext;
                    153:        for(; *s && (*s != '=') && !PERCENT(*s); s++)
                    154:                ;
                    155:        na = s-a;
                    156:        if(PERCENT(*s)) s++;
                    157:        b = s;
                    158:        for(; *s && (*s != '='); s++)
                    159:                ;
                    160:        nb = s-b;
                    161:        if(*s == '=') s++;
                    162:        c = s;
                    163:        for(; *s && !PERCENT(*s); s++)
                    164:                ;
                    165:        nc = s-c;
                    166:        if(PERCENT(*s)) s++, destsub = 1;
                    167:        d = s;
                    168:        for(; *s; s++)
                    169:                ;
                    170:        nd = s-d;
                    171:        /* break into words, do sub */
                    172:        while(*val){
                    173:                for(s = val; *s && !SEP(*s); s++)
                    174:                        ;
                    175:                /* substitute in val..s */
                    176:                if((memcmp(val, a, na) == 0) && (memcmp(s-nb, b, nb) == 0)){
                    177: #define        DEST(s,n)       if(n) memcpy(dest,s,n), dest += n
                    178:                        DEST(c, nc);
                    179:                        n = (s-nb) - (val+na);
                    180:                        if(destsub)
                    181:                                DEST(val+na, n);
                    182:                        DEST(d, nd);
                    183:                } else
                    184:                        while(val < s)
                    185:                                *dest++ = (*val++&~EBIT)|bit;
                    186:                /* clean up */
                    187:                while(*s && SEP(*s))
                    188:                        *dest++ = (*s++&~EBIT)|bit;
                    189:                val = s;
                    190:        }
                    191:        return(dest);
                    192: }
                    193: 
                    194: varsub(psrc, pdest, bit)
                    195:        char **psrc, **pdest;
                    196: {
                    197:        char *t, carry;
                    198:        Symtab *sym;
                    199:        char *src = *psrc, *dest = *pdest;
                    200:        char *v = 0, vc;
                    201: 
                    202:        if(*++src == '{'){
                    203:                for(t = ++src; *src != '}'; src++)
                    204:                        if(*src == 0){
                    205:                                SYNERR(-1);
                    206:                                Fprint(2, "missing '}'\n");
                    207:                                Exit();
                    208:                        }
                    209:                v = shname(t);
                    210:                if(src == v)
                    211:                        v = 0;
                    212:                else {
                    213:                        if(*v != ':'){
                    214:                                SYNERR(-1);
                    215:                                Fprint(2, "bad variable name\n");
                    216:                                Exit();
                    217:                        }
                    218:                        vc = *v;
                    219:                        *v = 0;
                    220:                }
                    221:                *src++ = carry = 0;
                    222:        } else {
                    223:                src = shname(t = src);
                    224:                carry = *src;
                    225:                *src = 0;
                    226:        }
                    227:        if(sym = symlook(t, S_VAR, (char *)0)){
                    228:                if(v){
                    229: char buf[BIGBLOCK]; strcpy(buf, v+1); lex(-1, buf);
                    230:                        dest = subsub(sym->value, buf, dest, bit);
                    231:                        *v = vc;
                    232:                } else
                    233:                        for(t = sym->value; *t; )
                    234:                                *dest++ = *t++|bit;
                    235:        }
                    236:        if(carry)
                    237:                *src = carry;
                    238:        *psrc = src;
                    239:        *pdest = dest;
                    240: }

unix.superglobalmegacorp.com

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