File:  [Research Unix] / researchv10no / cmd / basic / bas / renum.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

#include <stdio.h>
#include "ctype.h"
#include "typedef.h"
#include "basic.h"
#include "tokens.h"

static int	rencnt;
static Lnr	renbase, renincr, startln, endln;
static int	i;

char	*outlnr();
Lnr	cvtlnr(), newlnr();


/*
 * renumber --- renumber all stored lines
 */

renumber(line1, incr, brange, erange)
Lnr	line1;
Lnr	incr;
Lnr	brange;
Lnr	erange;
{
	register Linep	s;
	register Lnr	*p;
	Lnr		lnr;

	renbase = line1;
	renincr = incr;
	startln = brange;
	endln = erange;
	i = 0;
	p = (Lnr *)stkbase;
	rencnt = 0;
	lnr = line1;

	for ALL_LINES(s) {
		*p++ = s->l_lnr;	/* remember the line number */
		if ((char *)p >= stktop)
			err("too many lines");
		++rencnt;
		lnr += incr;
		if (lnr <= line1 || lnr > MAXLNR)
			err("invalid renumber parameters");
		}

	lnr = line1;
	for ALL_LINES(s) {
		if (s->l_lnr >= startln && s->l_lnr <= endln) {
		s->l_lnr = lnr;
		lnr += incr;
		}
		}
	for ALL_LINES(s) {
		immed.l_lnr = s->l_lnr;
		if (renumline(s))
			storeline(&immed);
		}
}


/*
 * renumline --- renumber the line pointed to by s
 *		 line numbers are always preceeded by:	
 *			 THEN, GOTO, GOSUB
 *		 for an ON statement, there is a list of line numbers
 *		 following the GOTO or GOSUB
 */

renumline(s)
Linep	s;
{
	register char	*p, *q;
	int		changed, onflag;
	Lnr		l;

	changed = 0;
	onflag = 0;
	p = s->l_line;
	for (q = immed.l_line, p = s->l_line; *p; ) {
		switch ((*q++ = *p++)) {
		case ON:
			++onflag;
			break;
		case COMMA:
			if (!onflag)
				break;
			/* fall thru if inside a ON ... GO ... */
		case USING:
		case THEN:
		case ELSE:
		case GOTO:
		case GOSUB:
			if (isdigit(*p)) {
				inptr = p;
				l = cvtlnr();
				p = inptr;
				l = newlnr(l);
				q = outlnr(q, l);
				++changed;
				}
			break;
		case COLON:
		case REM:
			onflag = 0;	/* reset onflag at end of statement */
			break;
			}
		}
	*q++ = 0;
	*q = 0;
	immed.l_len = q - immed.l_line + LINESIZE;
	if (immed.l_len & 1)
		++immed.l_len;
	return(changed);
}


/*
 * outlnr --- convert specified line number to character string
 */

char *outlnr(bp, lnr)
char	*bp;
Lnr	lnr;
{
	register char	*p;

	p = bp;
	sprintf(p, "%u", lnr);
	while (*p++)
		;
	return (--p);
}


/*
 * newlnr --- map old line number into a new one
 */

Lnr newlnr(lnr)
register Lnr	lnr;
{
	register Lnr	*p;
	register Linep	s;

	p = (Lnr *)stkbase;
	for ALL_LINES(s) {
		if (*p++ == lnr)
			return(s->l_lnr);
			}
	fprintf(stderr, "line %u not found\n", lnr);
	return (lnr);
}

unix.superglobalmegacorp.com

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