|
|
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 = ®t[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 = ®t[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 = ®t[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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.