File:  [MW Coherent from dump] / coherent / d / bin / nroff / req1.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:39 2019 UTC (7 years, 2 months ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

/*
 * req1.c
 * Nroff/Troff.
 * Requests (a-m).
 */

#include <ctype.h>
#include "roff.h"

/*
 * User abort.
 */
req_ab()
{
	register char *bp;

	bp = nextarg(miscbuf, NULL, 0);
	if (*bp != '\0')
		fprintf(stderr, "%s\n", bp);
	else
		fprintf(stderr, "User abort\n");
	leave(1);
}

/*
 * Turn adjust mode on and set adjust type.
 */
req_ad(argc, argv) int argc; char *argv[];
{
	adm = 1;
	if (argc < 2)
		return;
	switch (argv[1][0]) {
	case 'l':
		adj = LJUS;
		return;
	case 'c':
		adj = CJUS;
		return;
	case 'r':
		adj = RJUS;
		return;
	case 'b':
	case 'u':
		adj = FJUS;
		return;
	default:
		printe("bad adjustment type");
		return;
	}
}

/*
 * Assign format.
 */
req_af(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	int n;
	char name[2];
	register char *p, c;

	argname(argv[1], name);
	rp = getnreg(name);
	if (index("iIaA", c=argv[2][0])) {
		rp->n_reg.r_form = c;
		return;
	}
	if (isascii(c) && isdigit(c)) {
		n = '0';
		p = &argv[2][1];
		while (isascii(c = *p++) && isdigit(*p))
			;
		if (p-argv[2] > 9) {
			printe("field with too large");
			return;
		}
		rp->n_reg.r_form = '0' + p-argv[2];
	}
}

/*
 * Append to macro.
 */
req_am(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	register MAC *mp;
	char name[2];

	argname(argv[1], name);
	if ((rp=findreg(name, RTEXT)) == NULL) {
		rp = makereg(name, RTEXT);
		mp = &rp->t_reg.r_macd;
	} else {
		for (mp = &rp->t_reg.r_macd;
		     mp->t_div.m_next;
		     mp=mp->t_div.m_next)
			;
		mp->t_div.m_next = (MAC *)nalloc(sizeof (*mp));
		mp = mp->t_div.m_next;
	}
	deftext(mp, argv[2]);
}

/*
 * Append to string.
 */
req_as(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	register MAC *mp;
	char name[2];
	register char *cp;

	argname(argv[1], name);
	if ((rp=findreg(name, RTEXT)) == NULL) {
		rp = makereg(name, RTEXT);
		mp = &rp->t_reg.r_macd;
	} else {
		for (mp = &rp->t_reg.r_macd; mp->t_div.m_next; mp=mp->t_div.m_next)
			;
		mp->t_div.m_next = (MAC *)nalloc(sizeof *mp);
		mp = mp->t_div.m_next;
	}
	cp = nalloc(strlen(argv[2]) + 1);
	strcpy(cp, argv[2]);
	mp->t_div.m_next = NULL;
	mp->t_div.m_type = MTEXT;
	mp->t_div.m_core = cp;
}

/*
 * Embolden.					(.bd)	$$TO_DO$$
 */
req_bd(argc, argv) int argc; char *argv[];
{
	printu(".bd");
}

/*
 * Overstrike bold command.
 * !V7.
 */
req_bo(argc, argv) int argc; char *argv[];
{
	if (argc == 1)
		enb++;
	else
		enb = atoi(argv[1]);
}

/*
 * Begin page.
 */
req_bp(argc, argv) int argc; char *argv[];
{
	setbreak();
	if (argc >= 2) {
		npn = numb(argv[1], SMUNIT, SDUNIT);
		pspace();
		return;
	}
	if (nsm == 0)
		pspace();
}

/*
 * Break.
 */
req_br()
{
	setbreak();
}

/*
 * Set nobreak control character.
 */
req_c2(argc, argv) int argc; char *argv[];
{
	nbc = argc>1 ? argv[1][0] : '\'';
}

/*
 * Set control character.
 */
req_cc(argc, argv) int argc; char *argv[];
{
	ccc = argc>1 ? argv[1][0] : '.';
}

/*
 * Center all text.
 */
req_ce(argc, argv) int argc; char *argv[];
{
	setbreak();
	cec = number(argv[1], SMUNIT, SDUNIT, 0, 0, 1);
}

/*
 * Change trap location.
 */
req_ch(argc, argv) int argc; char *argv[];
{
	register TPL **tpp, *tp;
	register DIV *dp;
	int rpos, apos;
	char name[2];

	dp = mdivp;
	argname(argv[1], name);
	for (tpp = &dp->d_stpl; tp = *tpp; tpp = &tp->t_next) {
		if (name[0]==tp->t_name[0] && name[1]==tp->t_name[1]) {
			if (dp->d_trap == tp)
				dp->d_trap = tp->t_next;
			if (dp->d_ctpp == tp)
				dp->d_ctpp = tp->t_next;
			*tpp = tp->t_next;
			nfree(tp);
			break;
		}
	}
	if (argc >= 3) {
		rpos = numb(argv[2], SMVLSP, SDVLSP);
		apos = rpos>=0 ? rpos : pgl+rpos;
		for (tpp = &dp->d_stpl; tp = *tpp; tpp = &tp->t_next) {
			if (apos <= tp->t_apos)
				break;
		}
		tp = (TPL *)nalloc(sizeof (TPL));
		tp->t_rpos = rpos;
		tp->t_apos = apos;
		tp->t_name[0] = name[0];
		tp->t_name[1] = name[1];
		tp->t_next = *tpp;
		*tpp = tp;
		if (dp->d_trap==tp->t_next && apos>=0)
			dp->d_trap = tp;
		if (dp->d_ctpp==tp->t_next && apos>=dp->d_rpos)
			dp->d_ctpp = tp;
	}
}

/*
 * Copy input verbatim to output.
 * !V7.
 * Added by steve 12/21/90, usage modified 6/19/91.
 */
req_co(argc, argv) int argc; char *argv[];
{
	register char *cp, *endmark;
	register int c, i;
	char *cp1;

	putchar('\n');
	for (i = 1; i < argc; i++)
		printf("%d ", number(argv[i], SMUNIT, SDUNIT, 0, 0, 0));
	cp = endmark = ".co";
	while ((c = getl(1)) != EOF) {
		if (c == *cp) {			/* match next endmark char */
			cp++;
			continue;
		} else if (c == '\n' && *cp == '\0')
			return;			/* matched endmark, done */
		for (cp1 = endmark; cp1 < cp; )
			putchar(*cp1++);	/* copy matched portion */
		putchar(c);			/* copy this character */
		cp = endmark;			/* try again from start */
	}
	printe(".co: unexpected EOF before %s", endmark);
}

/*
 * Set constant character space mode.
 */
req_cs(argc, argv) int argc; char *argv[];
{
	char name[2];
	register int n, ems;

	argname(argv[1], name);
	if ((n = font_number(name, ".cs: ")) < 0)
		return;
	ems = number(argv[3], SMPOIN, SDPOIN, 0, 0, unit(SMEMSP, SDEMSP));
	dev_cs(n, numb(argv[2], (long)ems, 36L));
}

/*
 * Continous underline.
 * This just does a .ul.
 * This is wrong, .cu is supposed to underline spaces as well as words.
 */
req_cu(argc, argv) int argc; char *argv[];
{
	req_ul(argc, argv);
}

/*
 * Divert and append output to macro.
 */
req_da(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	register MAC *mp;
	char name[2];

	if (argc < 2) {
		enddivn();
		return;
	}
	argname(argv[1], name);
	newdivn(name);
	if ((rp=findreg(name, RTEXT)) == NULL) {
		rp = makereg(name, RTEXT);
		cdivp->d_seek = tmpseek;
		mp = &rp->t_reg.r_macd;
		mp->t_div.m_next = NULL;
	} else {
		cdivp->d_maxh = rp->t_reg.r_maxh;
		cdivp->d_maxw = rp->t_reg.r_maxw;
		for (mp = &rp->t_reg.r_macd; mp->t_div.m_next; mp=mp->t_div.m_next)
			;
	}
	mp->t_div.m_type = MDIVN;
	mp->t_div.m_size = 0;
	mp->t_div.m_core = NULL;
	mp->t_div.m_seek = tmpseek;
	cdivp->d_macp = mp;
}

/*
 * Define a special character.
 * Added by steve 4/16/91.
 */
req_dc(argc, argv) int argc; char *argv[];
{
	char name[2];

	argname(argv[1], name);
	spc_def(name, (argc < 3) ? "" : argv[2]);
}

/*
 * Define a macro.
 */
req_de(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	char name[2];

	argname(argv[1], name);
	rp = makereg(name, RTEXT);
	deftext(&rp->t_reg.r_macd, argv[2]);
}

/*
 * Divert output to macro.
 */
req_di(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	char name[2];

	if (argc < 2) {
		enddivn();
		return;
	}
	argname(argv[1], name);
	newdivn(name);
	rp = makereg(name, RTEXT);
	cdivp->d_macp = &rp->t_reg.r_macd;
	cdivp->d_seek = tmpseek;
	rp->t_reg.r_macd.t_div.m_next = NULL;
	rp->t_reg.r_macd.t_div.m_type = MDIVN;
	rp->t_reg.r_macd.t_div.m_size = 0;
	rp->t_reg.r_macd.t_div.m_core = NULL;
	rp->t_reg.r_macd.t_div.m_seek = tmpseek;
}

/*
 * Define a string.
 */
req_ds(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	char name[2];
	register char *cp;

	argname(argv[1], name);
	rp = makereg(name, RTEXT);
	cp = nalloc(strlen(argv[2]) + 1);
	strcpy(cp, argv[2]);
	rp->t_reg.r_macd.t_div.m_next = NULL;
	rp->t_reg.r_macd.t_div.m_type = MTEXT;
	rp->t_reg.r_macd.t_div.m_core = cp;
}

/*
 * Set a diversion trap.			(.dt)	$$TO_DO$$
 */
req_dt(argc, argv) int argc; char *argv[];
{
	printu(".dt");
}

/*
 * Set escape character.
 */
req_ec(argc, argv) int argc; char *argv[];
{
	esc = argc>1 ? argv[1][0] : '\\';
}

/*
 * Else part of if-else.
 */
req_el(argc, argv) int argc; char *argv[];
{
	if (iestackx < 0) {
		printe(".el without .ie");
		return;
	}
	do_cond(!iestack[iestackx--], nextarg(miscbuf, NULL, 0));
}

/*
 * Set end macro.
 */
req_em(argc, argv) int argc; char *argv[];
{
	argname(argv[1], endtrap);
}

/*
 * Turn off escape mechanism.
 */
req_eo()
{
	esc = '\0';
}

/*
 * Change environments.
 */
req_ev(argc, argv) int argc; char *argv[];
{
	register int old, new;

	if (argc < 2) {
		dprintd(DBGENVR, "pop environment\n");
		if (envs == 0) {
			printe("cannot pop environment");
			return;
		}
		old = envstak[envs];
		new = envstak[--envs];
	} else {
		new = numb(argv[1], SMUNIT, SDUNIT);
		dprint2(DBGENVR, "push environment %d\n", new);
		if (new < 0 || new >= ENVS) {
			printe("environment does not exist");
			return;
		}
		if (envs >= ENVSTACK) {
			printe("environments stacked too deeply");
			return;
		}
		old = envstak[envs];
		envstak[++envs] = new;
	}
	dprint2(DBGENVR|DBGFILE, "writing environment %d\n", old);
	envsave(old);
	if (envinit[new] == 0) {
		dprint2(DBGENVR, "initializing env %d\n", new);
		envset();
		envinit[new] = 1;
		setfont("R", 1);
	} else {
		dprint2(DBGENVR|DBGFILE, "reading environment %d\n", new);
		envload(new);
	}
}

/*
 * Exit from nroff.
 */
req_ex()
{
	leave(0);
}

/*
 * Flush the buffers (used for transparent flushing...)
 * !V7.
 */
req_fb()
{
	flushl(linebuf, llinptr);	/* Flush the buffer... */
	llinptr = linebuf;		/* Reset the buffer... */
}

/*
 * Set field delimiter and pad character.	(.fc)	$$TO_DO$$
 */
req_fc(argc, argv) int argc; char *argv[];
{
	printu(".fc");
}

/*
 * Display a list of fonts to standard error.
 * !V7.
 */
req_fd()
{
	font_display();
}

/*
 * Turn on fill mode.
 */
req_fi()
{
	setbreak();
	fill = 1;
}

/*
 * Flush.
 */
req_fl()
{
	setbreak();
}

/*
 * Define font at position.
 */
req_fp(argc, argv) int argc; char *argv[];
{
	register int n;

	n = argv[1][0] - '0';
	if ((1 <= n) && (n <= 9)) {
		mapfont[n][0] = argv[2][0];
		mapfont[n][1] = argv[2][1];
	} else
		printe("font position out of range");

}

/*
 * Set current font.
 */
req_ft(argc, argv) int argc; char *argv[];
{
	char name[2];

	argname(argv[1], name);
	setfont(name, 1);
}

/*
 * Force font size.
 */
req_fz(argc, argv) int argc; char *argv[];
{
	if (argc != 3)
		printe(".fz: requires font name and size");
	else
		dev_fz(argv[1], argv[2]);
}

/*
 * Hyphenation mode.				(.hc)	$$TO_DO$$
 */
req_hc(argc, argv) int argc; char *argv[];
{
	printu(".hc");
}

/*
 * Hyphenation indicator character.		(.hw)	$$TO_DO$$
 */
req_hw(argc, argv) int argc; char *argv[];
{
	printu(".hw");
}

/*
 * Hyphenation exception words.			(.hy)	$$TO_DO$$
 */
req_hy(argc, argv) int argc; char *argv[];
{
	printu(".hy");
}

/*
 * If part of if-else.
 */
req_ie(argc, argv) int argc; char *argv[];
{
	if (iestackx >= IESTACKSIZE-1)
		printe(".ie nested more than %d levels", IESTACKSIZE);
	else
		iestack[++iestackx] = req_if(argc, argv);
}

/*
 * If (conditional execution of command).
 * This returns the condition and is called from 'req_ie'.
 */
req_if()
{
	int not, con;
	unsigned char charbuf[CBFSIZE];
	register int c;
	register unsigned char *bp, *cp, *cp1, *cp2;

	bp = (unsigned char *)nextarg(miscbuf, NULL, 0);

	/* Look for leading '!'. */
	if (*bp == '!') {
		bp++;
		not = 1;
	} else
		not = 0;

	/* Look for built-ins. */
	switch (*bp++) {
	case 'e':			/* Current page number is even. */
		con = !(pno % 2);
		break;
	case 'l':
		con = lflag;		/* Landscape mode. */
		break;
	case 'n':			/* Formatter is Nroff. */
		con = (ntroff == NROFF);
		break;
	case 'o':			/* Current page number is odd. */
		con = pno % 2;
		break;
	case 'p':
		con = pflag;		/* PostScript mode. */
		break;
	case 't':			/* Formatter is Troff. */
		con = (ntroff == TROFF);
		break;
	default:
		c = *--bp;			/* first character */
		if ((isascii(c) && isdigit(c)) || c == '(' || c == '+' || c == '-') {
			/* Numeric expression. */
			bp = (unsigned char *)nextarg(bp, charbuf, CBFSIZE);
			con = numb(charbuf, SMUNIT, SDUNIT) != 0;
			break;
		}

		/* String comparison. */
		con = 0;
		if (c == '\0')
			break;
		cp1 = ++bp;			/* start of first string */
		if ((cp = index(cp1, c)) == NULL)
			break;
		cp2 = ++cp;			/* start of second string */
		if ((cp = index(cp2, c)) == NULL)
			break;
		bp = cp + 1;			/* bp points after third c */
		if (cp - cp2 != (cp2-1) - cp1)
			break;			/* lengths differ, unequal */
		con = strncmp(cp1, cp2, cp - cp2) == 0;	/* compare strings */
	}
	if (not)
		con = !con;
	do_cond(con, bp);
	return con;
}

/*
 * Ignore.
 */
req_ig(argc, argv) int argc; char *argv[];
{
	deftext(NULL, argv[1]);
}

/*
 * Set indent.
 */
req_in(argc, argv) int argc; char *argv[];
{
	setval(&ind, &oldind, argv[1], SMEMSP, SDEMSP);
	setbreak();
}


/*
 * Set an input line count trap.
 */
req_it(argc, argv) int argc; char *argv[];
{
	if (argc < 3) {
		inpltrc = 0;
		return;
	}
	inpltrc = numb(argv[1], SMUNIT, SDUNIT);
	argname(argv[2], inptrap);
}

/*
 * Leader repetition character.
 */
req_lc(argc, argv) int argc; char *argv[];
{
	ldc = (argc < 1) ? '\0' : argv[1][0];
}

/*
 * Load a font width table.
 * !V7.
 * Added by steve 12/12/90.
 */
req_lf(argc, argv) int argc; char *argv[];
{
	if (argc < 3) {
		printe(".lf: requires fontname and filename");
		return;
	}
	load_font(argv[1], argv[2]);
	if (argc == 4)
		dev_fz(argv[1], argv[3]);
}

/*
 * Set ligature mode.
 */
req_lg(argc, argv) int argc; char *argv[];
{
	lgm = numb(argv[1], SMUNIT, SDUNIT) > 0;
}

/*
 * Set line length.
 */
req_ll(argc, argv) int argc; char *argv[];
{
	setval(&lln, &oldlln, argv[1], SMEMSP, SDEMSP);
}

/*
 * Set line spacing.
 */
req_ls(argc, argv) int argc; char *argv[];
{
	setval(&lsp, &oldlsp, argv[1], SMUNIT, SDUNIT);
}

/*
 * Set title length.
 */
req_lt(argc, argv) int argc; char *argv[];
{
	setval(&tln, &oldtln, argv[1], SMEMSP, SDEMSP);
}

/*
 * Set margin character.
 */
req_mc(argc, argv) int argc; char *argv[];
{
	if (argc < 2) {
		mrc = '\0';
	} else {
		mrc = argv[1][0];
#ifdef	mfn
		/* Margin font number (if required later...) */
		mfn = curfont;
#endif
	}
	if (argc > 2)
		mar = number(argv[2], SMEMSP, SDEMSP, mar, 0, 0);
}

/*
 * Mark vertical place internally in diversion or in number register.
 */
req_mk(argc, argv) int argc; char *argv[];
{
	register REG *rp;
	char name[2];

	if (argc == 1) {
		cdivp->d_mk = cdivp->d_rpos;
		return;
	}
	argname(argv[1], name);
	if ((rp=findreg(name, RNUMR)) == NULL) {
		rp = makereg(name, RNUMR);
		rp->n_reg.r_incr = 1;
		rp->n_reg.r_form = '1';
	}
	rp->n_reg.r_nval = cdivp->d_rpos;
}

/* end of req1.c */

unix.superglobalmegacorp.com

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