|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.