|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 8944 (0x22f0)
Types: TextFile
Notes: UNIX file
Names: »req2.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/nroff/req2.c«
/*
* Nroff/Troff.
* Requests (n-z).
*/
#include <stdio.h>
#include <ctype.h>
#include "roff.h"
#include "code.h"
#include "env.h"
#include "div.h"
#include "reg.h"
#include "str.h"
#include "esc.h"
/*
* Turn adjust mode off.
*/
req_na()
{
adm = 0;
}
/*
* Need.
*/
req_ne(argc, argv)
char *argv[];
{
}
/*
* Go into no fill mode.
*/
req_nf()
{
setbreak();
fil = 0;
}
/*
* Turn off hyphenation
*/
req_nh()
{
hyp = 0 /* turn the durn thing off */;
}
/*
* Set number mode.
*/
req_nm(argc, argv)
char *argv[];
{
/*
if ((lnn=number(argv[1], SMUNIT, SDUNIT, lnn, 0, 0)) <= 0) {
lnn = 0;
return;
}
if (argv[2][0] != '\0')
lnm = number(argv[2], SMUNIT, SDUNIT, 0, 0, 1);
if (argv[3][0] != '\0')
lns = number(argv[3], SMDIGW, SDDIGW, 0, 0, 1);
if (argv[4][0] != '\0')
lni = number(argv[4], SMDIGW, SDDIGW, 0, 0, 1);
*/
}
/*
* Turn off line number mode for n lines.
*/
req_nn(argc, argv)
char *argv[];
{
/*
register int n;
lnc = number(argv[1], SMUNIT, SDUNIT, 0, 0, 1);
*/
}
/*
* Define a number register.
*/
req_nr(argc, argv)
char *argv[];
{
register REG *rp;
char name[2];
argname(argv[1], name);
rp = getnreg(name, RNUMR);
rp->r_nval = number(argv[2], SMUNIT, SDUNIT, rp->r_nval, 0, 0);
if (argc >= 4)
rp->r_incr = number(argv[3], SMUNIT, SDUNIT, 0, 0, 0);
}
/*
* Turn no-space mode on.
*/
req_ns()
{
nsm = 1;
}
/*
* End input from current file and switch to given file.
*/
req_nx(argc, argv)
char *argv[];
{
register FILE *fp;
register STR *sp;
sp = strp;
do {
if (sp == NULL) {
printe("Cannot find current file");
return;
}
} while (sp->s_type != SFILE);
if ((fp=fopen(argv[1], "r")) == NULL) {
printe("Cannot open %s", argv[1]);
return;
}
fclose(sp->s_fp);
sp->s_fp = fp;
}
/*
* Output saved space.
*/
req_os()
{
sspace(svs);
}
/*
* Set page number character in title.
*/
req_pc(argc, argv)
char *argv[];
{
tpc = argv[1][0];
}
/*
* Set page length.
*/
req_pl(argc, argv)
char *argv[];
{
pgl = number(argv[1], SMVLSP, SDVLSP, pgl, 0, unit(11*SMINCH, SDINCH));
if (pgl <= 0)
pgl = unit(SMVLSP, SDVLSP);
}
/*
* Print sizes of macros.
*/
req_pm(argc, argv)
{
register REG **rpp, *rp;
register MAC *mp;
unsigned asize, csize, dsize;
asize = 0;
csize = 0;
dsize = 0;
for (rpp = ®t[0]; rpp < ®t[RHTSIZE]; rpp++) {
for (rp = *rpp; rp; rp = rp->r_next) {
asize++;
csize += sizeof *rp;
if (rp->r_type != RTEXT)
continue;
csize -= sizeof rp->r_macd;
--asize;
for (mp = &rp->r_macd; mp; mp->m_next) {
asize++;
csize += sizeof *mp;
}
}
}
fprintf(stderr, "%u allocations\n", asize);
fprintf(stderr, "Core size = %u\n", csize);
/*
fprintf(stderr, "Disk size = %u\n", dsize);
*/
}
/*
* Set page number.
*/
req_pn(argc, argv)
char *argv[];
{
if (argc >= 2)
pno = number(argv[1], SMUNIT, SDUNIT, pno, 0, pno);
}
/*
* Set page offset.
*/
req_po(argc, argv)
char *argv[];
{
register int n;
n = pof;
pof = number(argv[1], SMEMSP, SDEMSP, pof, 0, oldpof);
oldpof = n;
}
/*
* Set pointsize.
*/
req_ps(argc, argv)
char *argv[];
{
register int n;
n = psz;
setpsze(number(argv[1], SMPOIN, SDPOIN, psz, 0, oldpsz));
oldpsz = n;
}
/*
* Read an insertion from the standard input.
*/
req_rd(argc, argv)
char *argv[];
{
register STR *sp;
if (argc >= 2)
fprintf(stderr, "%s", argv[1]);
else
putc(BEL, stderr);
sp = allstr(SSINP);
sp->s_next = strp;
strp = sp;
}
/*
* Remove text register or request.
*/
req_rm(argc, argv)
char *argv[];
{
char name[2];
register int i;
for (i=1; i<argc; i++) {
argname(argv[i], name);
if (reltreg(name))
continue;
printe("Cannot remove %s", argv[i]);
}
}
/*
* Rename the given request or macro.
*/
req_rn(argc, argv)
char *argv[];
{
register REG *rp;
char name[2];
argname(argv[1], name);
if ((rp=findreg(name, RTEXT)) == NULL) {
printe("Cannot find register %s", argv[1]);
return;
}
argname(argv[2], name);
rp->r_name[0] = name[0];
rp->r_name[1] = name[1];
}
/*
* Remove number register.
*/
req_rr(argc, argv)
char *argv[];
{
char name[2];
register int i;
for (i=1; i<argc; i++) {
argname(argv[i], name);
if (relnreg(name))
continue;
printe("Cannot remove %s", argv[i]);
}
}
/*
* Turn no space mode off.
*/
req_rs()
{
nsm = 0;
}
/*
* Return to marked vertical position.
*/
req_rt(argc, argv)
char *argv[];
{
register int n;
if (argc == 1)
n = cdivp->d_mk;
else
n = number(argv[1], SMVLSP, SDVLSP, 0, 0, 0);
if (n >= cdivp->d_rpos)
return;
sspace(n - cdivp->d_rpos);
}
/*
* Stack input and redirect from given file.
*/
req_so(argc, argv)
char *argv[];
{
adsfile(argv[1]);
}
/*
* Space vertically.
*/
req_sp(argc, argv)
char *argv[];
{
register int n;
if (nsm != 0)
return;
setbreak();
sspace(number(argv[1], SMVLSP, SDVLSP, 0, 1, 1));
}
/*
* Save vertical distance.
*/
req_sv(argc, argv)
char *argv[];
{
register int n;
n = number(argv[1], SMVLSP, SDVLSP, 0, 0, 1);
if (mdivp->d_rpos+n > mdivp->d_ctpp->t_rpos)
svs = n;
else
sspace(n);
}
/*
* Set tab stops.
*/
req_ta(argc, argv)
char *argv[];
{
register TAB *tp;
register int i;
register char *p;
int prevpos = 0;
tp = &tab[1];
for (i=1; i<argc; i++) {
if (i > TABSIZE-2) {
printe("Too many tab stops");
break;
}
p = argv[i];
if (*p == '\0') {
printe("Bad tab stop");
break;
}
while (*p)
p++;
tp->t_jus = LJUS;
switch (*--p) {
case 'L':
tp->t_jus = LJUS;
*p = '\0';
break;
case 'C':
tp->t_jus = CJUS;
*p = '\0';
break;
case 'R':
tp->t_jus = RJUS;
*p = '\0';
break;
}
tp->t_pos = number(argv[i], SMEMSP, SDEMSP, prevpos, 0, 0);
if (tp->t_pos < prevpos) {
printe("Bad tab stop");
break;
}
prevpos = tp->t_pos;
tp++;
}
tp->t_jus = '\0';
}
/*
* Set tab character.
*/
req_tc(argc, argv)
char *argv[];
{
tbc = argv[1][0];
}
/*
* Temporary indent.
*/
req_ti(argc, argv)
char *argv[];
{
register int n;
setbreak();
tin = number(argv[1], SMEMSP, SDEMSP, ind, 0, 0);
tif = 1;
}
/*
* Three part title.
*/
req_tl(argc, argv)
char *argv[];
{
CODE *cp;
int i;
register int n;
char charbuf[CBFSIZE], endc, c;
register char *bp, *lp;
ENV savenv;
savenv = env; /* massive block copy */
setline();
ind = 0;
lln = tln;
fil = 0;
bp = nextarg(miscbuf, NULL, 0);
if ((endc=*bp) != '\0')
bp++;
for (i=0; i<3; i++) {
lp = charbuf;
for (;;) {
if (*bp == '\0')
break;
if ((c=*bp++) == endc)
break;
if (c == tpc) {
char digits[5];
register char *dp = &digits[0];
register int pn = pno;
for(; pn > 0; pn /= 10)
*dp++ = pn%10 + '0';
while (--dp > &digits[0])
*lp++ = *dp;
c = *dp;
}
if (lp >= &charbuf[CBFSIZE-2]) {
printe("Section %d of title too large", i+1);
break;
}
*lp++ = c;
}
if (lp != charbuf) {
*lp++ = '\0';
adscore(charbuf);
strp->s_eoff = 1;
process();
wordbreak(DHMOV);
}
switch (i) {
case 0:
n = llinsiz;
cp = llinptr;
break;
case 1:
n = (lln - llinsiz - n)/2;
nlinsiz = llinsiz += cp->c_iarg = n;
cp = llinptr;
break;
case 2:
n = lln - llinsiz;
cp->c_iarg += n;
llinsiz += n;
break;
}
}
linebreak();
env = savenv;
}
/*
* Print a message on the terminal.
*/
req_tm(argc, argv)
char *argv[];
{
fprintf(stderr, "%s\n", nextarg(miscbuf, NULL, 0));
}
/*
* Translate on output.
*/
req_tr(argc, argv)
char *argv[];
{
register char c1, c2, *p;
p = argv[1];
while (c1=*p++) {
if ((c2=*p++) == '\0') {
--p;
c2 = ' ';
}
if (!isascii(c1) || !isascii(c2))
continue;
trantab[c1] = c2;
}
}
/*
* Set underline font.
*/
req_uf(argc, argv)
char *argv[];
{
}
/*
* Underline.
*/
req_ul(argc, argv)
char *argv[];
{
ufp[0] = fon[0];
ufp[1] = fon[1];
setfont(uft, 0);
ulc = number(argv[1], SMUNIT, SDUNIT, 0, 0, 1);
}
/*
* Set vertical base line spacing.
*/
req_vs(argc, argv)
char *argv[];
{
register int n;
n = vls;
vls = number(argv[1], SMPOIN, SDPOIN, vls, 0, oldvls);
oldvls = n;
}
/*
* Set a trap.
*/
req_wh(argc, argv)
char *argv[];
{
register TPL **tpp, *tp;
register DIV *dp;
int rpos, apos;
rpos = number(argv[1], SMVLSP, SDVLSP, 0, 0, 0);
apos = rpos>=0 ? rpos : pgl+rpos;
dp = mdivp;
for (tpp=&dp->d_stpl; tp=*tpp; tpp=&tp->t_next) {
if (apos == tp->t_apos) {
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);
if (argc < 3) /* .wh NN xx !replaces all at NN */
break; /* .wh NN !only removes 1st */
} else if (apos < tp->t_apos)
break;
}
if (argc >= 3) {
tp = nalloc(sizeof (TPL));
tp->t_rpos = rpos;
tp->t_apos = apos;
argname(argv[2], tp->t_name);
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;
}
}
/*
* Debugging command.
*/
req_zz()
{
d00flag = 1;
}