Annotation of coherent/d/bin/nroff/reg.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * reg.c
                      3:  * Nroff/Troff.
                      4:  * Register manipulation.
                      5:  */
                      6: 
                      7: #include "roff.h"
                      8: 
                      9: /*
                     10:  * Return a pointer to a number register of the given name.
                     11:  */
                     12: REG *
                     13: getnreg(name) char name[2];
                     14: {
                     15:        register REG *rp;
                     16: 
                     17:        if ((rp = findreg(name, RNUMR)) == NULL) {
                     18:                rp = makereg(name, RNUMR);
                     19:                rp->n_reg.r_nval = 0;
                     20:                rp->n_reg.r_form = '1';
                     21:                rp->n_reg.r_incr = 1;
                     22:        }
                     23:        return rp;
                     24: }
                     25: 
                     26: /*
                     27:  * Create a register of the given name and type.  If one
                     28:  * already exists, remove it.
                     29:  */
                     30: REG    *
                     31: makereg(name, type) char name[2]; int type;
                     32: {
                     33:        REG **rpp;
                     34:        register REG *rp;
                     35:        register MAC *mp, *lmp;
                     36: 
                     37:        if (rp = findreg(name, type)) {
                     38: #if    (DDEBUG & DBGREGS)
                     39:                printd(DBGREGS,"makereg: deleting old register %c%c\n",
                     40:                        name[0], name[1]);
                     41: #endif
                     42:                if (rp->t_reg.r_type == RTEXT) {
                     43:                        rp->t_reg.r_maxh = 0;
                     44:                        rp->t_reg.r_maxw = 0;
                     45:                        mp = rp->t_reg.r_macd.t_div.m_next;
                     46:                        while (mp) {
                     47:                                if (mp->t_div.m_type==MTEXT &&
                     48:                                    mp->t_div.m_core!=NULL)
                     49:                                        nfree(mp->t_div.m_core);
                     50:                                lmp = mp;
                     51:                                mp = mp->t_div.m_next;
                     52:                                nfree(lmp);
                     53:                        }
                     54:                }
                     55:        } else {
                     56: #if    (DDEBUG & DBGREGS)
                     57:                printd(DBGREGS,"makereg: creating register %c%c, type %d\n",
                     58:                                name[0],name[1],type);
                     59: #endif
                     60:                rpp = &regt[hash(name)];
                     61:                rp = (REG *) nalloc(sizeof *rp);
                     62:                rp->t_reg.r_type = type;
                     63:                rp->t_reg.r_name[0] = name[0];
                     64:                rp->t_reg.r_name[1] = name[1];
                     65:                rp->t_reg.r_maxh = 0;
                     66:                rp->t_reg.r_maxw = 0;
                     67:                rp->t_reg.r_next = *rpp;
                     68:                *rpp = rp;
                     69:        }
                     70:        return rp;
                     71: }
                     72: 
                     73: /*
                     74:  * Remove the given text register or request.
                     75:  * Return 1 if the register is found, else 0.
                     76:  */
                     77: reltreg(name) char name[2];
                     78: {
                     79:        MAC *lmp;
                     80:        register MAC *mp;
                     81:        register REG *rp, **lrp;
                     82: 
                     83: #if    (DDEBUG & DBGREGS)
                     84:        printd(DBGREGS, "reltreg: removing text register %c%c\n", name[0],name[1]);
                     85: #endif
                     86:        for (lrp = &regt[hash(name)]; rp = *lrp; lrp = &rp->t_reg.r_next) {
                     87:                if (rp->n_reg.r_name[0]==name[0] &&
                     88:                    rp->n_reg.r_name[1]==name[1]) {
                     89:                        if (rp->n_reg.r_type != RTEXT)
                     90:                                continue;
                     91:                        mp = rp->t_reg.r_macd.t_div.m_next;
                     92:                        while (mp) {
                     93:                                if (mp->t_div.m_type==MTEXT &&
                     94:                                    mp->t_div.m_core!=NULL)
                     95:                                        nfree(mp->t_div.m_core);
                     96:                                lmp = mp;
                     97:                                mp = mp->t_div.m_next;
                     98:                                nfree(lmp);
                     99:                        }
                    100:                        *lrp = rp->t_reg.r_next;
                    101:                        nfree(rp);
                    102:                        return 1;
                    103:                }
                    104:        }
                    105:        return 0;
                    106: }
                    107: 
                    108: /*
                    109:  * Remove the given number register.
                    110:  * Return 1 if we found it, else 0.
                    111:  */
                    112: relnreg(name) char name[2];
                    113: {
                    114:        register REG *rp, **lrp;
                    115: 
                    116: #if    (DDEBUG & DBGREGS)
                    117:        printd(DBGREGS, "relnreg: removing number register %c%c\n",
                    118:                name[0],name[1]);
                    119: #endif
                    120:        for (lrp = &regt[hash(name)]; rp = *lrp; lrp = &rp->t_reg.r_next) {
                    121:                if (rp->n_reg.r_name[0]==name[0] &&
                    122:                    rp->n_reg.r_name[1]==name[1]) {
                    123:                        if (rp->n_reg.r_type == RNUMR) {
                    124:                                *lrp = rp->t_reg.r_next;
                    125:                                nfree(rp);
                    126:                                return 1;
                    127:                        }
                    128:                }
                    129:        }
                    130:        return 0;
                    131: }
                    132: 
                    133: /*
                    134:  * Given a register name and a register type,
                    135:  * return a pointer to the register if it exists or NULL if not.
                    136:  */
                    137: REG *
                    138: findreg(name, type) char name[2]; int type;
                    139: {
                    140:        register REG *rp;
                    141: 
                    142: #if    (DDEBUG & DBGREGX)
                    143:        printd(DBGREGX, "findreg: looking for register %c%c, type %d --",
                    144:                        name[0],name[1],type);
                    145: #endif
                    146:        for (rp=regt[hash(name)]; rp; rp=rp->t_reg.r_next)
                    147:                if (rp->n_reg.r_name[0]==name[0] &&
                    148:                    rp->n_reg.r_name[1]==name[1])
                    149:                        if (rp->n_reg.r_type == type) {
                    150: #if    (DDEBUG & DBGREGX)
                    151:                                printd(DBGREGX, "found\n");
                    152: #endif
                    153:                                return rp;
                    154:                        }
                    155: #if    (DDEBUG & DBGREGX)
                    156:        printd(DBGREGX, "not found\n");
                    157: #endif
                    158:        return NULL;
                    159: }
                    160: 
                    161: /*
                    162:  * Convert a string to a two character register name.
                    163:  */
                    164: argname(str, name) register char *str; char name[2];
                    165: {
                    166:        if ((name[0] = str[0]) == '\0')
                    167:                name[1] = '\0';
                    168:        else
                    169:                name[1] = str[1];
                    170: }
                    171: 
                    172: /* end of reg.c */

unix.superglobalmegacorp.com

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