DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦a98664677⟧ TextFile

    Length: 2583 (0xa17)
    Types: TextFile
    Notes: UNIX file
    Names: »reg.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦f4b8d8c84⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »cmd/nroff/reg.c« 

TextFile

/*
 * 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 = &regt[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=&regt[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=&regt[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];
}