Annotation of researchv10no/cmd/basic/bas/renum.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "ctype.h"
        !             3: #include "typedef.h"
        !             4: #include "basic.h"
        !             5: #include "tokens.h"
        !             6: 
        !             7: static int     rencnt;
        !             8: static Lnr     renbase, renincr, startln, endln;
        !             9: static int     i;
        !            10: 
        !            11: char   *outlnr();
        !            12: Lnr    cvtlnr(), newlnr();
        !            13: 
        !            14: 
        !            15: /*
        !            16:  * renumber --- renumber all stored lines
        !            17:  */
        !            18: 
        !            19: renumber(line1, incr, brange, erange)
        !            20: Lnr    line1;
        !            21: Lnr    incr;
        !            22: Lnr    brange;
        !            23: Lnr    erange;
        !            24: {
        !            25:        register Linep  s;
        !            26:        register Lnr    *p;
        !            27:        Lnr             lnr;
        !            28: 
        !            29:        renbase = line1;
        !            30:        renincr = incr;
        !            31:        startln = brange;
        !            32:        endln = erange;
        !            33:        i = 0;
        !            34:        p = (Lnr *)stkbase;
        !            35:        rencnt = 0;
        !            36:        lnr = line1;
        !            37: 
        !            38:        for ALL_LINES(s) {
        !            39:                *p++ = s->l_lnr;        /* remember the line number */
        !            40:                if ((char *)p >= stktop)
        !            41:                        err("too many lines");
        !            42:                ++rencnt;
        !            43:                lnr += incr;
        !            44:                if (lnr <= line1 || lnr > MAXLNR)
        !            45:                        err("invalid renumber parameters");
        !            46:                }
        !            47: 
        !            48:        lnr = line1;
        !            49:        for ALL_LINES(s) {
        !            50:                if (s->l_lnr >= startln && s->l_lnr <= endln) {
        !            51:                s->l_lnr = lnr;
        !            52:                lnr += incr;
        !            53:                }
        !            54:                }
        !            55:        for ALL_LINES(s) {
        !            56:                immed.l_lnr = s->l_lnr;
        !            57:                if (renumline(s))
        !            58:                        storeline(&immed);
        !            59:                }
        !            60: }
        !            61: 
        !            62: 
        !            63: /*
        !            64:  * renumline --- renumber the line pointed to by s
        !            65:  *              line numbers are always preceeded by:  
        !            66:  *                      THEN, GOTO, GOSUB
        !            67:  *              for an ON statement, there is a list of line numbers
        !            68:  *              following the GOTO or GOSUB
        !            69:  */
        !            70: 
        !            71: renumline(s)
        !            72: Linep  s;
        !            73: {
        !            74:        register char   *p, *q;
        !            75:        int             changed, onflag;
        !            76:        Lnr             l;
        !            77: 
        !            78:        changed = 0;
        !            79:        onflag = 0;
        !            80:        p = s->l_line;
        !            81:        for (q = immed.l_line, p = s->l_line; *p; ) {
        !            82:                switch ((*q++ = *p++)) {
        !            83:                case ON:
        !            84:                        ++onflag;
        !            85:                        break;
        !            86:                case COMMA:
        !            87:                        if (!onflag)
        !            88:                                break;
        !            89:                        /* fall thru if inside a ON ... GO ... */
        !            90:                case USING:
        !            91:                case THEN:
        !            92:                case ELSE:
        !            93:                case GOTO:
        !            94:                case GOSUB:
        !            95:                        if (isdigit(*p)) {
        !            96:                                inptr = p;
        !            97:                                l = cvtlnr();
        !            98:                                p = inptr;
        !            99:                                l = newlnr(l);
        !           100:                                q = outlnr(q, l);
        !           101:                                ++changed;
        !           102:                                }
        !           103:                        break;
        !           104:                case COLON:
        !           105:                case REM:
        !           106:                        onflag = 0;     /* reset onflag at end of statement */
        !           107:                        break;
        !           108:                        }
        !           109:                }
        !           110:        *q++ = 0;
        !           111:        *q = 0;
        !           112:        immed.l_len = q - immed.l_line + LINESIZE;
        !           113:        if (immed.l_len & 1)
        !           114:                ++immed.l_len;
        !           115:        return(changed);
        !           116: }
        !           117: 
        !           118: 
        !           119: /*
        !           120:  * outlnr --- convert specified line number to character string
        !           121:  */
        !           122: 
        !           123: char *outlnr(bp, lnr)
        !           124: char   *bp;
        !           125: Lnr    lnr;
        !           126: {
        !           127:        register char   *p;
        !           128: 
        !           129:        p = bp;
        !           130:        sprintf(p, "%u", lnr);
        !           131:        while (*p++)
        !           132:                ;
        !           133:        return (--p);
        !           134: }
        !           135: 
        !           136: 
        !           137: /*
        !           138:  * newlnr --- map old line number into a new one
        !           139:  */
        !           140: 
        !           141: Lnr newlnr(lnr)
        !           142: register Lnr   lnr;
        !           143: {
        !           144:        register Lnr    *p;
        !           145:        register Linep  s;
        !           146: 
        !           147:        p = (Lnr *)stkbase;
        !           148:        for ALL_LINES(s) {
        !           149:                if (*p++ == lnr)
        !           150:                        return(s->l_lnr);
        !           151:                        }
        !           152:        fprintf(stderr, "line %u not found\n", lnr);
        !           153:        return (lnr);
        !           154: }

unix.superglobalmegacorp.com

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