Annotation of researchv10no/cmd/mk/src/quote.c, revision 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.