|
|
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: 2583 (0xa17)
Types: TextFile
Notes: UNIX file
Names: »reg.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/nroff/reg.c«
/*
* Nroff/Troff.
* Register manipulation.
*/
#include <stdio.h>
#include "roff.h"
#include "reg.h"
/*
* Return a pointer to a number register of the given name.
*/
char *
getnreg(name)
char name[2];
{
register REG *rp;
if ((rp=findreg(name, RNUMR)) == NULL) {
rp = makereg(name, RNUMR);
rp->r_nval = 0;
rp->r_form = '1';
rp->r_incr = 1;
}
return (rp);
}
/*
* Create a register of the given name and type. If one
* already exists, remove it.
*/
char *
makereg(name, type)
char name[2];
{
REG **rpp;
register REG *rp;
register MAC *mp, *lmp;
if (rp=findreg(name, type)) {
if (rp->r_type == RTEXT) {
rp->r_maxh = 0;
rp->r_maxw = 0;
mp = rp->r_macd.m_next;
while (mp) {
if (mp->m_type==MTEXT && mp->m_core!=NULL)
nfree(mp->m_core);
lmp = mp;
mp = mp->m_next;
nfree(lmp);
}
}
} else {
rpp = ®t[hash(name)];
rp = (REG *) nalloc(sizeof *rp);
rp->r_type = type;
rp->r_name[0] = name[0];
rp->r_name[1] = name[1];
rp->r_maxh = 0;
rp->r_maxw = 0;
rp->r_next = *rpp;
*rpp = rp;
}
return (rp);
}
/*
* Remove the given text register or request. Return 1 if
* the register is found, else 0.
*/
reltreg(name)
char name[2];
{
MAC *lmp;
register MAC *mp;
register REG *rp, **lrp;
for (lrp=®t[hash(name)]; rp=*lrp; lrp=&rp->r_next) {
if (rp->r_name[0]==name[0] && rp->r_name[1]==name[1]) {
if (rp->r_type != RTEXT)
continue;
mp = rp->r_macd.m_next;
while (mp) {
if (mp->m_type==MTEXT && mp->m_core!=NULL)
nfree(mp->m_core);
lmp = mp;
mp = mp->m_next;
nfree(lmp);
}
*lrp = rp->r_next;
nfree(rp);
return (1);
}
}
return (0);
}
/*
* Remove the given number register. Return 1 if we found it,
* else 0.
*/
relnreg(name)
char name[2];
{
register REG *rp, **lrp;
for (lrp=®t[hash(name)]; rp=*lrp; lrp=&rp->r_next) {
if (rp->r_name[0]==name[0] && rp->r_name[1]==name[1]) {
if (rp->r_type == RNUMR) {
*lrp = rp->r_next;
nfree(rp);
return (1);
}
}
}
return (0);
}
/*
* Given a register name, and a register type, return a pointer
* to the register if it exists. If not, NULL is returned.
*/
char *
findreg(name, type)
char name[2];
{
register REG *rp;
for (rp=regt[hash(name)]; rp; rp=rp->r_next)
if (rp->r_name[0]==name[0] && rp->r_name[1]==name[1])
if (rp->r_type == type)
return (rp);
return (NULL);
}
/*
* Convert a string to a two character register name.
*/
argname(str, name)
register char *str;
char name[2];
{
if ((name[0]=str[0]) == '\0')
name[1] = '\0';
else
name[1] = str[1];
}