|
|
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: 3587 (0xe03)
Types: TextFile
Notes: UNIX file
Names: »main.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/nroff/main.c«
/*
* Nroff/Troff.
* Main programme and initialisation.
*/
#include <stdio.h>
#include <ctype.h>
#include <types.h>
#include <time.h>
#include "roff.h"
#include "code.h"
#include "env.h"
#include "esc.h"
#include "div.h"
#include "reg.h"
#include "str.h"
main(argc, argv)
register char *argv[];
{
char name[2];
int filflag, tinflag;
register REG *rp;
register int i;
devparm();
initialise();
filflag = 0;
tinflag = 0;
for (i=1; i<argc; i++) {
if (argv[i][0] != '-') {
filflag = 1;
if (adsfile(argv[i]) != 0)
process();
continue;
}
switch (argv[i][1]) {
case 'a':
antflag = 1;
continue;
case 'd':
debflag++;
continue;
case 'i':
tinflag++;
continue;
case 'm':
sprintf(miscbuf, "%stmac.%s", TMACDIR, &argv[i][2]);
adsfile(miscbuf);
process();
continue;
case 'n':
pno = atoi(&argv[i][2]);
npn = 1 + pno;
continue;
case 'r':
if ((name[0]=argv[i][2]) == '\0')
continue;
name[1] = '\0';
rp = getnreg(name);
rp->r_nval = atoi(&argv[i][3]);
continue;
case 'T':
if (ntroff == NROFF)
tntflag = 1;
continue;
case 'x':
ntrflag++;
continue;
default:
fprintf(stderr, "Bad option: %s\n", argv[i]);
exit(1);
}
}
if (filflag==0 || tinflag!=0) {
adsunit(stdin);
process();
}
leave();
}
/*
* Open temp file, set up registers and general initialisation.
*/
initialise()
{
char *np;
register REG *rp;
register REQ *qp;
register int i;
char *mktemp();
#if RSX
if ((tmp=fopen("rofftmp", "r+w")) == NULL)
panic("Cannot open temp file");
fmkdl(tmp);
#else
np = mktemp("/tmp/rofXXXXXX");
if ((tmp=fopen(np, "w")) == NULL)
panic("Cannot create temp file");
else if (freopen(np, "r+w", tmp) == NULL)
panic("Cannot reopen temp file");
unlink(np);
#endif
tmpseek = ENVSIZE * sizeof (ENV);
tmpseek = (tmpseek+DBFSIZE+DBFSIZE-1) & ~(DBFSIZE-1);
for (i=0; i<RHTSIZE; i++)
regt[i] = NULL;
for (qp=reqtab; qp->q_name[0]; qp++) {
rp = makereg(qp->q_name, RTEXT);
rp->r_macd.m_next = NULL;
rp->r_macd.m_type = MREQS;
rp->r_macd.m_func = qp->q_func;
}
nrpnreg = getnreg("%");
nrctreg = getnreg("ct");
nrdlreg = getnreg("dl");
nrdnreg = getnreg("dn");
nrdwreg = getnreg("dw");
nrdyreg = getnreg("dy");
nrhpreg = getnreg("hp");
nrlnreg = getnreg("ln");
nrmoreg = getnreg("mo");
nrnlreg = getnreg("nl");
nrsbreg = getnreg("sb");
nrstreg = getnreg("st");
nryrreg = getnreg("yr");
setnreg();
for (i=0; i<ENVSIZE; i++)
envinit[i] = 0;
envs = 0;
envstak[envs] = 0;
setenvr();
envinit[0] = 1;
cdivp = NULL;
newdivn("\0\0");
mdivp = cdivp;
endtrap[0] = '\0';
outflag = 0;
strp = NULL;
pgl = unit(11*SMINCH, SDINCH);
pct = 0;
pno = 1;
nrpnreg->r_nval = 1;
npn = 2;
esc = '\\';
svs = 0;
nbrflag = 0;
byeflag = 0;
ifeflag = 0;
ntrflag = 0;
debflag = 0;
antflag = ntroff==NROFF;
tntflag = 0;
nrorval = 0;
}
/*
* Initialise pre-defined number registers.
*/
setnreg()
{
#if RSX
int timebuf[8];
time(timebuf);
nryrreg->r_nval = timebuf[0];
nrmoreg->r_nval = timebuf[1];
nrdyreg->r_nval = timebuf[2];
#else
time_t time();
time_t curtime;
register struct tm *tmp;
curtime = time((time_t *)0);
tmp = localtime(&curtime);
nryrreg->r_nval = tmp->tm_year%100;
nrmoreg->r_nval = tmp->tm_mon+1;
nrdyreg->r_nval = tmp->tm_mday;
nrdwreg->r_nval = tmp->tm_wday + 1;
#endif
}
/*
* Leave.
*/
leave()
{
char name[2];
if (endtrap[0] != '\0') {
name[0] = endtrap[0];
name[1] = endtrap[1];
endtrap[0] = '\0';
execute(name);
}
setbreak();
if (ntrflag == 0) {
byeflag = 1;
pspace(0);
}
exit(0);
}