13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * troff4.c 33e12c5d1SDavid du Colombier * 43e12c5d1SDavid du Colombier * number registers, conversion, arithmetic 53e12c5d1SDavid du Colombier */ 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier #include "tdef.h" 83e12c5d1SDavid du Colombier #include "fns.h" 93e12c5d1SDavid du Colombier #include "ext.h" 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier int regcnt = NNAMES; 133e12c5d1SDavid du Colombier int falsef = 0; /* on if inside false branch of if */ 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier #define NHASHSIZE 128 /* must be 2**n */ 163e12c5d1SDavid du Colombier #define NHASH(i) ((i>>6)^i) & (NHASHSIZE-1) 173e12c5d1SDavid du Colombier Numtab *nhash[NHASHSIZE]; 183e12c5d1SDavid du Colombier 19*219b2ee8SDavid du Colombier Numtab *numtabp = NULL; 20*219b2ee8SDavid du Colombier #define NDELTA 400 21*219b2ee8SDavid du Colombier int ncnt = 0; 22*219b2ee8SDavid du Colombier 233e12c5d1SDavid du Colombier void setn(void) 243e12c5d1SDavid du Colombier { 253e12c5d1SDavid du Colombier int i, j, f; 263e12c5d1SDavid du Colombier Tchar ii; 27*219b2ee8SDavid du Colombier Uchar *p; 28*219b2ee8SDavid du Colombier char buf[NTM]; /* for \n(.S */ 293e12c5d1SDavid du Colombier 303e12c5d1SDavid du Colombier f = nform = 0; 313e12c5d1SDavid du Colombier if ((i = cbits(ii = getach())) == '+') 323e12c5d1SDavid du Colombier f = 1; 333e12c5d1SDavid du Colombier else if (i == '-') 343e12c5d1SDavid du Colombier f = -1; 353e12c5d1SDavid du Colombier else if (ii) /* don't put it back if it's already back (thanks to jaap) */ 363e12c5d1SDavid du Colombier ch = ii; 373e12c5d1SDavid du Colombier if (falsef) 383e12c5d1SDavid du Colombier f = 0; 393e12c5d1SDavid du Colombier if ((i = getsn()) == 0) 403e12c5d1SDavid du Colombier return; 413e12c5d1SDavid du Colombier p = unpair(i); 423e12c5d1SDavid du Colombier if (p[0] == '.') 433e12c5d1SDavid du Colombier switch (p[1]) { 443e12c5d1SDavid du Colombier case 's': 453e12c5d1SDavid du Colombier i = pts; 463e12c5d1SDavid du Colombier break; 473e12c5d1SDavid du Colombier case 'v': 483e12c5d1SDavid du Colombier i = lss; 493e12c5d1SDavid du Colombier break; 503e12c5d1SDavid du Colombier case 'f': 513e12c5d1SDavid du Colombier i = font; 523e12c5d1SDavid du Colombier break; 533e12c5d1SDavid du Colombier case 'p': 543e12c5d1SDavid du Colombier i = pl; 553e12c5d1SDavid du Colombier break; 563e12c5d1SDavid du Colombier case 't': 573e12c5d1SDavid du Colombier i = findt1(); 583e12c5d1SDavid du Colombier break; 593e12c5d1SDavid du Colombier case 'o': 603e12c5d1SDavid du Colombier i = po; 613e12c5d1SDavid du Colombier break; 623e12c5d1SDavid du Colombier case 'l': 633e12c5d1SDavid du Colombier i = ll; 643e12c5d1SDavid du Colombier break; 653e12c5d1SDavid du Colombier case 'i': 663e12c5d1SDavid du Colombier i = in; 673e12c5d1SDavid du Colombier break; 683e12c5d1SDavid du Colombier case '$': 693e12c5d1SDavid du Colombier i = frame->nargs; 703e12c5d1SDavid du Colombier break; 713e12c5d1SDavid du Colombier case 'A': 723e12c5d1SDavid du Colombier i = ascii; 733e12c5d1SDavid du Colombier break; 743e12c5d1SDavid du Colombier case 'c': 75*219b2ee8SDavid du Colombier i = numtabp[CD].val; 763e12c5d1SDavid du Colombier break; 773e12c5d1SDavid du Colombier case 'n': 783e12c5d1SDavid du Colombier i = lastl; 793e12c5d1SDavid du Colombier break; 803e12c5d1SDavid du Colombier case 'a': 813e12c5d1SDavid du Colombier i = ralss; 823e12c5d1SDavid du Colombier break; 833e12c5d1SDavid du Colombier case 'h': 843e12c5d1SDavid du Colombier i = dip->hnl; 853e12c5d1SDavid du Colombier break; 863e12c5d1SDavid du Colombier case 'd': 873e12c5d1SDavid du Colombier if (dip != d) 883e12c5d1SDavid du Colombier i = dip->dnl; 893e12c5d1SDavid du Colombier else 90*219b2ee8SDavid du Colombier i = numtabp[NL].val; 913e12c5d1SDavid du Colombier break; 923e12c5d1SDavid du Colombier case 'u': 933e12c5d1SDavid du Colombier i = fi; 943e12c5d1SDavid du Colombier break; 953e12c5d1SDavid du Colombier case 'j': 963e12c5d1SDavid du Colombier i = ad + 2 * admod; 973e12c5d1SDavid du Colombier break; 983e12c5d1SDavid du Colombier case 'w': 993e12c5d1SDavid du Colombier i = widthp; 1003e12c5d1SDavid du Colombier break; 1013e12c5d1SDavid du Colombier case 'x': 1023e12c5d1SDavid du Colombier i = nel; 1033e12c5d1SDavid du Colombier break; 1043e12c5d1SDavid du Colombier case 'y': 1053e12c5d1SDavid du Colombier i = un; 1063e12c5d1SDavid du Colombier break; 1073e12c5d1SDavid du Colombier case 'T': 1083e12c5d1SDavid du Colombier i = dotT; 1093e12c5d1SDavid du Colombier break; /* -Tterm used in nroff */ 1103e12c5d1SDavid du Colombier case 'V': 1113e12c5d1SDavid du Colombier i = VERT; 1123e12c5d1SDavid du Colombier break; 1133e12c5d1SDavid du Colombier case 'H': 1143e12c5d1SDavid du Colombier i = HOR; 1153e12c5d1SDavid du Colombier break; 1163e12c5d1SDavid du Colombier case 'k': 1173e12c5d1SDavid du Colombier i = ne; 1183e12c5d1SDavid du Colombier break; 1193e12c5d1SDavid du Colombier case 'P': 1203e12c5d1SDavid du Colombier i = print; 1213e12c5d1SDavid du Colombier break; 1223e12c5d1SDavid du Colombier case 'L': 1233e12c5d1SDavid du Colombier i = ls; 1243e12c5d1SDavid du Colombier break; 125*219b2ee8SDavid du Colombier case 'R': /* maximal # of regs that can be addressed */ 126*219b2ee8SDavid du Colombier i = 255*256 - regcnt; 1273e12c5d1SDavid du Colombier break; 1283e12c5d1SDavid du Colombier case 'z': 1293e12c5d1SDavid du Colombier p = unpair(dip->curd); 1303e12c5d1SDavid du Colombier *pbp++ = p[1]; /* watch order */ 1313e12c5d1SDavid du Colombier *pbp++ = p[0]; 1323e12c5d1SDavid du Colombier return; 1333e12c5d1SDavid du Colombier case 'b': 1343e12c5d1SDavid du Colombier i = bdtab[font]; 1353e12c5d1SDavid du Colombier break; 1363e12c5d1SDavid du Colombier case 'F': 1373e12c5d1SDavid du Colombier cpushback(cfname[ifi]); 1383e12c5d1SDavid du Colombier return; 139*219b2ee8SDavid du Colombier case 'S': 140*219b2ee8SDavid du Colombier buf[0] = j = 0; 141*219b2ee8SDavid du Colombier for( i = 0; tabtab[i] != 0 && i < NTAB; i++) { 142*219b2ee8SDavid du Colombier if (i > 0) 143*219b2ee8SDavid du Colombier buf[j++] = ' '; 144*219b2ee8SDavid du Colombier sprintf(&buf[j], "%d", tabtab[i] & TABMASK); 145*219b2ee8SDavid du Colombier j = strlen(buf); 146*219b2ee8SDavid du Colombier if ( tabtab[i] & RTAB) 147*219b2ee8SDavid du Colombier sprintf(&buf[j], "uR"); 148*219b2ee8SDavid du Colombier else if (tabtab[i] & CTAB) 149*219b2ee8SDavid du Colombier sprintf(&buf[j], "uC"); 150*219b2ee8SDavid du Colombier else 151*219b2ee8SDavid du Colombier sprintf(&buf[j], "uL"); 152*219b2ee8SDavid du Colombier j += 2; 153*219b2ee8SDavid du Colombier } 154*219b2ee8SDavid du Colombier cpushback(buf); 155*219b2ee8SDavid du Colombier return; 1563e12c5d1SDavid du Colombier default: 1573e12c5d1SDavid du Colombier goto s0; 1583e12c5d1SDavid du Colombier } 1593e12c5d1SDavid du Colombier else { 1603e12c5d1SDavid du Colombier s0: 1613e12c5d1SDavid du Colombier if ((j = findr(i)) == -1) 1623e12c5d1SDavid du Colombier i = 0; 1633e12c5d1SDavid du Colombier else { 164*219b2ee8SDavid du Colombier i = numtabp[j].val = numtabp[j].val + numtabp[j].inc * f; 165*219b2ee8SDavid du Colombier nform = numtabp[j].fmt; 1663e12c5d1SDavid du Colombier } 1673e12c5d1SDavid du Colombier } 1683e12c5d1SDavid du Colombier setn1(i, nform, (Tchar) 0); 1693e12c5d1SDavid du Colombier } 1703e12c5d1SDavid du Colombier 1713e12c5d1SDavid du Colombier Tchar numbuf[25]; 1723e12c5d1SDavid du Colombier Tchar *numbufp; 1733e12c5d1SDavid du Colombier 1743e12c5d1SDavid du Colombier int wrc(Tchar i) 1753e12c5d1SDavid du Colombier { 1763e12c5d1SDavid du Colombier if (numbufp >= &numbuf[24]) 1773e12c5d1SDavid du Colombier return(0); 1783e12c5d1SDavid du Colombier *numbufp++ = i; 1793e12c5d1SDavid du Colombier return(1); 1803e12c5d1SDavid du Colombier } 1813e12c5d1SDavid du Colombier 1823e12c5d1SDavid du Colombier 1833e12c5d1SDavid du Colombier 1843e12c5d1SDavid du Colombier /* insert into input number i, in format form, with size-font bits bits */ 1853e12c5d1SDavid du Colombier void setn1(int i, int form, Tchar bits) 1863e12c5d1SDavid du Colombier { 1873e12c5d1SDavid du Colombier numbufp = numbuf; 1883e12c5d1SDavid du Colombier nrbits = bits; 1893e12c5d1SDavid du Colombier nform = form; 1903e12c5d1SDavid du Colombier fnumb(i, wrc); 1913e12c5d1SDavid du Colombier *numbufp = 0; 1923e12c5d1SDavid du Colombier pushback(numbuf); 1933e12c5d1SDavid du Colombier } 1943e12c5d1SDavid du Colombier 195*219b2ee8SDavid du Colombier void prnumtab(Numtab *p) 196*219b2ee8SDavid du Colombier { 197*219b2ee8SDavid du Colombier int i; 198*219b2ee8SDavid du Colombier for (i = 0; i < ncnt; i++) 199*219b2ee8SDavid du Colombier if (p) 200*219b2ee8SDavid du Colombier if (p[i].r != 0) 201*219b2ee8SDavid du Colombier fprintf(stderr, "slot %d, %s, val %d\n", i, unpair(p[i].r), p[i].val); 202*219b2ee8SDavid du Colombier else 203*219b2ee8SDavid du Colombier fprintf(stderr, "slot %d empty\n", i); 204*219b2ee8SDavid du Colombier else 205*219b2ee8SDavid du Colombier fprintf(stderr, "slot %d empty\n", i); 206*219b2ee8SDavid du Colombier } 207*219b2ee8SDavid du Colombier 208*219b2ee8SDavid du Colombier void nnspace(void) 209*219b2ee8SDavid du Colombier { 210*219b2ee8SDavid du Colombier ncnt = sizeof(numtab)/sizeof(Numtab) + NDELTA; 211*219b2ee8SDavid du Colombier numtabp = (Numtab *) grow((char *)numtabp, ncnt, sizeof(Numtab)); 212*219b2ee8SDavid du Colombier if (numtabp == NULL) { 213*219b2ee8SDavid du Colombier ERROR "not enough memory for registers", ncnt WARN; 214*219b2ee8SDavid du Colombier exit(1); 215*219b2ee8SDavid du Colombier } 216*219b2ee8SDavid du Colombier numtabp = (Numtab *) memcpy((char *)numtabp, (char *)numtab, 217*219b2ee8SDavid du Colombier sizeof(numtab)); 218*219b2ee8SDavid du Colombier if (numtabp == NULL) { 219*219b2ee8SDavid du Colombier ERROR "Cannot initialize registers" WARN; 220*219b2ee8SDavid du Colombier exit(1); 221*219b2ee8SDavid du Colombier } 222*219b2ee8SDavid du Colombier } 223*219b2ee8SDavid du Colombier 224*219b2ee8SDavid du Colombier void grownumtab(void) 225*219b2ee8SDavid du Colombier { 226*219b2ee8SDavid du Colombier ncnt += NDELTA; 227*219b2ee8SDavid du Colombier numtabp = (Numtab *) grow((char *) numtabp, ncnt, sizeof(Numtab)); 228*219b2ee8SDavid du Colombier if (numtabp == NULL) { 229*219b2ee8SDavid du Colombier ERROR "Too many number registers (%d)", ncnt WARN; 230*219b2ee8SDavid du Colombier done2(04); 231*219b2ee8SDavid du Colombier } else { 232*219b2ee8SDavid du Colombier memset((char *)(numtabp) + (ncnt - NDELTA) * sizeof(Numtab), 233*219b2ee8SDavid du Colombier 0, NDELTA * sizeof(Numtab)); 234*219b2ee8SDavid du Colombier nrehash(); 235*219b2ee8SDavid du Colombier } 236*219b2ee8SDavid du Colombier } 2373e12c5d1SDavid du Colombier 2383e12c5d1SDavid du Colombier void nrehash(void) 2393e12c5d1SDavid du Colombier { 2403e12c5d1SDavid du Colombier Numtab *p; 2413e12c5d1SDavid du Colombier int i; 2423e12c5d1SDavid du Colombier 2433e12c5d1SDavid du Colombier for (i=0; i<NHASHSIZE; i++) 2443e12c5d1SDavid du Colombier nhash[i] = 0; 245*219b2ee8SDavid du Colombier for (p=numtabp; p < &numtabp[ncnt]; p++) 2463e12c5d1SDavid du Colombier p->link = 0; 247*219b2ee8SDavid du Colombier for (p=numtabp; p < &numtabp[ncnt]; p++) { 2483e12c5d1SDavid du Colombier if (p->r == 0) 2493e12c5d1SDavid du Colombier continue; 2503e12c5d1SDavid du Colombier i = NHASH(p->r); 2513e12c5d1SDavid du Colombier p->link = nhash[i]; 2523e12c5d1SDavid du Colombier nhash[i] = p; 2533e12c5d1SDavid du Colombier } 2543e12c5d1SDavid du Colombier } 2553e12c5d1SDavid du Colombier 2563e12c5d1SDavid du Colombier void nunhash(Numtab *rp) 2573e12c5d1SDavid du Colombier { 2583e12c5d1SDavid du Colombier Numtab *p; 2593e12c5d1SDavid du Colombier Numtab **lp; 2603e12c5d1SDavid du Colombier 2613e12c5d1SDavid du Colombier if (rp->r == 0) 2623e12c5d1SDavid du Colombier return; 2633e12c5d1SDavid du Colombier lp = &nhash[NHASH(rp->r)]; 2643e12c5d1SDavid du Colombier p = *lp; 2653e12c5d1SDavid du Colombier while (p) { 2663e12c5d1SDavid du Colombier if (p == rp) { 2673e12c5d1SDavid du Colombier *lp = p->link; 2683e12c5d1SDavid du Colombier p->link = 0; 2693e12c5d1SDavid du Colombier return; 2703e12c5d1SDavid du Colombier } 2713e12c5d1SDavid du Colombier lp = &p->link; 2723e12c5d1SDavid du Colombier p = p->link; 2733e12c5d1SDavid du Colombier } 2743e12c5d1SDavid du Colombier } 2753e12c5d1SDavid du Colombier 2763e12c5d1SDavid du Colombier int findr(int i) 2773e12c5d1SDavid du Colombier { 2783e12c5d1SDavid du Colombier Numtab *p; 2793e12c5d1SDavid du Colombier int h = NHASH(i); 2803e12c5d1SDavid du Colombier 2813e12c5d1SDavid du Colombier if (i == 0) 2823e12c5d1SDavid du Colombier return(-1); 283*219b2ee8SDavid du Colombier a0: 2843e12c5d1SDavid du Colombier for (p = nhash[h]; p; p = p->link) 2853e12c5d1SDavid du Colombier if (i == p->r) 286*219b2ee8SDavid du Colombier return(p - numtabp); 287*219b2ee8SDavid du Colombier for (p = numtabp; p < &numtabp[ncnt]; p++) { 2883e12c5d1SDavid du Colombier if (p->r == 0) { 2893e12c5d1SDavid du Colombier p->r = i; 2903e12c5d1SDavid du Colombier p->link = nhash[h]; 2913e12c5d1SDavid du Colombier nhash[h] = p; 2923e12c5d1SDavid du Colombier regcnt++; 293*219b2ee8SDavid du Colombier return(p - numtabp); 2943e12c5d1SDavid du Colombier } 2953e12c5d1SDavid du Colombier } 296*219b2ee8SDavid du Colombier grownumtab(); 297*219b2ee8SDavid du Colombier goto a0; 2983e12c5d1SDavid du Colombier } 2993e12c5d1SDavid du Colombier 3003e12c5d1SDavid du Colombier int usedr(int i) /* returns -1 if nr i has never been used */ 3013e12c5d1SDavid du Colombier { 3023e12c5d1SDavid du Colombier Numtab *p; 3033e12c5d1SDavid du Colombier 3043e12c5d1SDavid du Colombier if (i == 0) 3053e12c5d1SDavid du Colombier return(-1); 3063e12c5d1SDavid du Colombier for (p = nhash[NHASH(i)]; p; p = p->link) 3073e12c5d1SDavid du Colombier if (i == p->r) 308*219b2ee8SDavid du Colombier return(p - numtabp); 3093e12c5d1SDavid du Colombier return -1; 3103e12c5d1SDavid du Colombier } 3113e12c5d1SDavid du Colombier 3123e12c5d1SDavid du Colombier 3133e12c5d1SDavid du Colombier int fnumb(int i, int (*f)(Tchar)) 3143e12c5d1SDavid du Colombier { 3153e12c5d1SDavid du Colombier int j; 3163e12c5d1SDavid du Colombier 3173e12c5d1SDavid du Colombier j = 0; 3183e12c5d1SDavid du Colombier if (i < 0) { 3193e12c5d1SDavid du Colombier j = (*f)('-' | nrbits); 3203e12c5d1SDavid du Colombier i = -i; 3213e12c5d1SDavid du Colombier } 3223e12c5d1SDavid du Colombier switch (nform) { 3233e12c5d1SDavid du Colombier default: 3243e12c5d1SDavid du Colombier case '1': 3253e12c5d1SDavid du Colombier case 0: 3263e12c5d1SDavid du Colombier return decml(i, f) + j; 3273e12c5d1SDavid du Colombier case 'i': 3283e12c5d1SDavid du Colombier case 'I': 3293e12c5d1SDavid du Colombier return roman(i, f) + j; 3303e12c5d1SDavid du Colombier case 'a': 3313e12c5d1SDavid du Colombier case 'A': 3323e12c5d1SDavid du Colombier return abc(i, f) + j; 3333e12c5d1SDavid du Colombier } 3343e12c5d1SDavid du Colombier } 3353e12c5d1SDavid du Colombier 3363e12c5d1SDavid du Colombier 3373e12c5d1SDavid du Colombier int decml(int i, int (*f)(Tchar)) 3383e12c5d1SDavid du Colombier { 3393e12c5d1SDavid du Colombier int j, k; 3403e12c5d1SDavid du Colombier 3413e12c5d1SDavid du Colombier k = 0; 3423e12c5d1SDavid du Colombier nform--; 3433e12c5d1SDavid du Colombier if ((j = i / 10) || (nform > 0)) 3443e12c5d1SDavid du Colombier k = decml(j, f); 3453e12c5d1SDavid du Colombier return(k + (*f)((i % 10 + '0') | nrbits)); 3463e12c5d1SDavid du Colombier } 3473e12c5d1SDavid du Colombier 3483e12c5d1SDavid du Colombier 3493e12c5d1SDavid du Colombier int roman(int i, int (*f)(Tchar)) 3503e12c5d1SDavid du Colombier { 3513e12c5d1SDavid du Colombier 3523e12c5d1SDavid du Colombier if (!i) 3533e12c5d1SDavid du Colombier return((*f)('0' | nrbits)); 3543e12c5d1SDavid du Colombier if (nform == 'i') 3553e12c5d1SDavid du Colombier return(roman0(i, f, "ixcmz", "vldw")); 3563e12c5d1SDavid du Colombier else 3573e12c5d1SDavid du Colombier return(roman0(i, f, "IXCMZ", "VLDW")); 3583e12c5d1SDavid du Colombier } 3593e12c5d1SDavid du Colombier 3603e12c5d1SDavid du Colombier 3613e12c5d1SDavid du Colombier int roman0(int i, int (*f)(Tchar), char *onesp, char *fivesp) 3623e12c5d1SDavid du Colombier { 3633e12c5d1SDavid du Colombier int q, rem, k; 3643e12c5d1SDavid du Colombier 3653e12c5d1SDavid du Colombier if (!i) 3663e12c5d1SDavid du Colombier return(0); 3673e12c5d1SDavid du Colombier k = roman0(i / 10, f, onesp + 1, fivesp + 1); 3683e12c5d1SDavid du Colombier q = (i = i % 10) / 5; 3693e12c5d1SDavid du Colombier rem = i % 5; 3703e12c5d1SDavid du Colombier if (rem == 4) { 3713e12c5d1SDavid du Colombier k += (*f)(*onesp | nrbits); 3723e12c5d1SDavid du Colombier if (q) 3733e12c5d1SDavid du Colombier i = *(onesp + 1); 3743e12c5d1SDavid du Colombier else 3753e12c5d1SDavid du Colombier i = *fivesp; 3763e12c5d1SDavid du Colombier return(k += (*f)(i | nrbits)); 3773e12c5d1SDavid du Colombier } 3783e12c5d1SDavid du Colombier if (q) 3793e12c5d1SDavid du Colombier k += (*f)(*fivesp | nrbits); 3803e12c5d1SDavid du Colombier while (--rem >= 0) 3813e12c5d1SDavid du Colombier k += (*f)(*onesp | nrbits); 3823e12c5d1SDavid du Colombier return(k); 3833e12c5d1SDavid du Colombier } 3843e12c5d1SDavid du Colombier 3853e12c5d1SDavid du Colombier 3863e12c5d1SDavid du Colombier int abc(int i, int (*f)(Tchar)) 3873e12c5d1SDavid du Colombier { 3883e12c5d1SDavid du Colombier if (!i) 3893e12c5d1SDavid du Colombier return((*f)('0' | nrbits)); 3903e12c5d1SDavid du Colombier else 3913e12c5d1SDavid du Colombier return(abc0(i - 1, f)); 3923e12c5d1SDavid du Colombier } 3933e12c5d1SDavid du Colombier 3943e12c5d1SDavid du Colombier 3953e12c5d1SDavid du Colombier int abc0(int i, int (*f)(Tchar)) 3963e12c5d1SDavid du Colombier { 3973e12c5d1SDavid du Colombier int j, k; 3983e12c5d1SDavid du Colombier 3993e12c5d1SDavid du Colombier k = 0; 4003e12c5d1SDavid du Colombier if (j = i / 26) 4013e12c5d1SDavid du Colombier k = abc0(j - 1, f); 4023e12c5d1SDavid du Colombier return(k + (*f)((i % 26 + nform) | nrbits)); 4033e12c5d1SDavid du Colombier } 4043e12c5d1SDavid du Colombier 4053e12c5d1SDavid du Colombier long atoi0(void) 4063e12c5d1SDavid du Colombier { 4073e12c5d1SDavid du Colombier int c, k, cnt; 4083e12c5d1SDavid du Colombier Tchar ii; 4093e12c5d1SDavid du Colombier long i, acc; 4103e12c5d1SDavid du Colombier 4113e12c5d1SDavid du Colombier acc = 0; 4123e12c5d1SDavid du Colombier nonumb = 0; 4133e12c5d1SDavid du Colombier cnt = -1; 4143e12c5d1SDavid du Colombier a0: 4153e12c5d1SDavid du Colombier cnt++; 4163e12c5d1SDavid du Colombier ii = getch(); 4173e12c5d1SDavid du Colombier c = cbits(ii); 4183e12c5d1SDavid du Colombier switch (c) { 4193e12c5d1SDavid du Colombier default: 4203e12c5d1SDavid du Colombier ch = ii; 4213e12c5d1SDavid du Colombier if (cnt) 4223e12c5d1SDavid du Colombier break; 4233e12c5d1SDavid du Colombier case '+': 4243e12c5d1SDavid du Colombier i = ckph(); 4253e12c5d1SDavid du Colombier if (nonumb) 4263e12c5d1SDavid du Colombier break; 4273e12c5d1SDavid du Colombier acc += i; 4283e12c5d1SDavid du Colombier goto a0; 4293e12c5d1SDavid du Colombier case '-': 4303e12c5d1SDavid du Colombier i = ckph(); 4313e12c5d1SDavid du Colombier if (nonumb) 4323e12c5d1SDavid du Colombier break; 4333e12c5d1SDavid du Colombier acc -= i; 4343e12c5d1SDavid du Colombier goto a0; 4353e12c5d1SDavid du Colombier case '*': 4363e12c5d1SDavid du Colombier i = ckph(); 4373e12c5d1SDavid du Colombier if (nonumb) 4383e12c5d1SDavid du Colombier break; 4393e12c5d1SDavid du Colombier acc *= i; 4403e12c5d1SDavid du Colombier goto a0; 4413e12c5d1SDavid du Colombier case '/': 4423e12c5d1SDavid du Colombier i = ckph(); 4433e12c5d1SDavid du Colombier if (nonumb) 4443e12c5d1SDavid du Colombier break; 4453e12c5d1SDavid du Colombier if (i == 0) { 4463e12c5d1SDavid du Colombier flusho(); 4473e12c5d1SDavid du Colombier ERROR "divide by zero." WARN; 4483e12c5d1SDavid du Colombier acc = 0; 4493e12c5d1SDavid du Colombier } else 4503e12c5d1SDavid du Colombier acc /= i; 4513e12c5d1SDavid du Colombier goto a0; 4523e12c5d1SDavid du Colombier case '%': 4533e12c5d1SDavid du Colombier i = ckph(); 4543e12c5d1SDavid du Colombier if (nonumb) 4553e12c5d1SDavid du Colombier break; 4563e12c5d1SDavid du Colombier acc %= i; 4573e12c5d1SDavid du Colombier goto a0; 4583e12c5d1SDavid du Colombier case '&': /*and*/ 4593e12c5d1SDavid du Colombier i = ckph(); 4603e12c5d1SDavid du Colombier if (nonumb) 4613e12c5d1SDavid du Colombier break; 4623e12c5d1SDavid du Colombier if ((acc > 0) && (i > 0)) 4633e12c5d1SDavid du Colombier acc = 1; 4643e12c5d1SDavid du Colombier else 4653e12c5d1SDavid du Colombier acc = 0; 4663e12c5d1SDavid du Colombier goto a0; 4673e12c5d1SDavid du Colombier case ':': /*or*/ 4683e12c5d1SDavid du Colombier i = ckph(); 4693e12c5d1SDavid du Colombier if (nonumb) 4703e12c5d1SDavid du Colombier break; 4713e12c5d1SDavid du Colombier if ((acc > 0) || (i > 0)) 4723e12c5d1SDavid du Colombier acc = 1; 4733e12c5d1SDavid du Colombier else 4743e12c5d1SDavid du Colombier acc = 0; 4753e12c5d1SDavid du Colombier goto a0; 4763e12c5d1SDavid du Colombier case '=': 4773e12c5d1SDavid du Colombier if (cbits(ii = getch()) != '=') 4783e12c5d1SDavid du Colombier ch = ii; 4793e12c5d1SDavid du Colombier i = ckph(); 4803e12c5d1SDavid du Colombier if (nonumb) { 4813e12c5d1SDavid du Colombier acc = 0; 4823e12c5d1SDavid du Colombier break; 4833e12c5d1SDavid du Colombier } 4843e12c5d1SDavid du Colombier if (i == acc) 4853e12c5d1SDavid du Colombier acc = 1; 4863e12c5d1SDavid du Colombier else 4873e12c5d1SDavid du Colombier acc = 0; 4883e12c5d1SDavid du Colombier goto a0; 4893e12c5d1SDavid du Colombier case '>': 4903e12c5d1SDavid du Colombier k = 0; 4913e12c5d1SDavid du Colombier if (cbits(ii = getch()) == '=') 4923e12c5d1SDavid du Colombier k++; 4933e12c5d1SDavid du Colombier else 4943e12c5d1SDavid du Colombier ch = ii; 4953e12c5d1SDavid du Colombier i = ckph(); 4963e12c5d1SDavid du Colombier if (nonumb) { 4973e12c5d1SDavid du Colombier acc = 0; 4983e12c5d1SDavid du Colombier break; 4993e12c5d1SDavid du Colombier } 5003e12c5d1SDavid du Colombier if (acc > (i - k)) 5013e12c5d1SDavid du Colombier acc = 1; 5023e12c5d1SDavid du Colombier else 5033e12c5d1SDavid du Colombier acc = 0; 5043e12c5d1SDavid du Colombier goto a0; 5053e12c5d1SDavid du Colombier case '<': 5063e12c5d1SDavid du Colombier k = 0; 5073e12c5d1SDavid du Colombier if (cbits(ii = getch()) == '=') 5083e12c5d1SDavid du Colombier k++; 5093e12c5d1SDavid du Colombier else 5103e12c5d1SDavid du Colombier ch = ii; 5113e12c5d1SDavid du Colombier i = ckph(); 5123e12c5d1SDavid du Colombier if (nonumb) { 5133e12c5d1SDavid du Colombier acc = 0; 5143e12c5d1SDavid du Colombier break; 5153e12c5d1SDavid du Colombier } 5163e12c5d1SDavid du Colombier if (acc < (i + k)) 5173e12c5d1SDavid du Colombier acc = 1; 5183e12c5d1SDavid du Colombier else 5193e12c5d1SDavid du Colombier acc = 0; 5203e12c5d1SDavid du Colombier goto a0; 5213e12c5d1SDavid du Colombier case ')': 5223e12c5d1SDavid du Colombier break; 5233e12c5d1SDavid du Colombier case '(': 5243e12c5d1SDavid du Colombier acc = atoi0(); 5253e12c5d1SDavid du Colombier goto a0; 5263e12c5d1SDavid du Colombier } 5273e12c5d1SDavid du Colombier return(acc); 5283e12c5d1SDavid du Colombier } 5293e12c5d1SDavid du Colombier 5303e12c5d1SDavid du Colombier 5313e12c5d1SDavid du Colombier long ckph(void) 5323e12c5d1SDavid du Colombier { 5333e12c5d1SDavid du Colombier Tchar i; 5343e12c5d1SDavid du Colombier long j; 5353e12c5d1SDavid du Colombier 5363e12c5d1SDavid du Colombier if (cbits(i = getch()) == '(') 5373e12c5d1SDavid du Colombier j = atoi0(); 5383e12c5d1SDavid du Colombier else { 5393e12c5d1SDavid du Colombier j = atoi1(i); 5403e12c5d1SDavid du Colombier } 5413e12c5d1SDavid du Colombier return(j); 5423e12c5d1SDavid du Colombier } 5433e12c5d1SDavid du Colombier 5443e12c5d1SDavid du Colombier 545*219b2ee8SDavid du Colombier /* 546*219b2ee8SDavid du Colombier * print error about illegal numeric argument; 547*219b2ee8SDavid du Colombier */ 548*219b2ee8SDavid du Colombier void prnumerr(void) 549*219b2ee8SDavid du Colombier { 550*219b2ee8SDavid du Colombier char err_buf[40]; 551*219b2ee8SDavid du Colombier static char warn[] = "Numeric argument expected"; 552*219b2ee8SDavid du Colombier int savcd = numtabp[CD].val; 553*219b2ee8SDavid du Colombier 554*219b2ee8SDavid du Colombier if (numerr.type == RQERR) 555*219b2ee8SDavid du Colombier sprintf(err_buf, "%c%s: %s", nb ? cbits(c2) : cbits(cc), 556*219b2ee8SDavid du Colombier unpair(numerr.req), warn); 557*219b2ee8SDavid du Colombier else 558*219b2ee8SDavid du Colombier sprintf(err_buf, "\\%c'%s': %s", numerr.esc, &numerr.escarg, 559*219b2ee8SDavid du Colombier warn); 560*219b2ee8SDavid du Colombier if (frame != stk) /* uncertainty correction */ 561*219b2ee8SDavid du Colombier numtabp[CD].val--; 562*219b2ee8SDavid du Colombier ERROR err_buf WARN; 563*219b2ee8SDavid du Colombier numtabp[CD].val = savcd; 564*219b2ee8SDavid du Colombier } 565*219b2ee8SDavid du Colombier 566*219b2ee8SDavid du Colombier 5673e12c5d1SDavid du Colombier long atoi1(Tchar ii) 5683e12c5d1SDavid du Colombier { 5693e12c5d1SDavid du Colombier int i, j, digits; 5703e12c5d1SDavid du Colombier double acc; /* this is the only double in troff! */ 571*219b2ee8SDavid du Colombier int neg, abs, field, decpnt; 572*219b2ee8SDavid du Colombier extern int ifnum; 5733e12c5d1SDavid du Colombier 574*219b2ee8SDavid du Colombier 575*219b2ee8SDavid du Colombier neg = abs = field = decpnt = digits = 0; 5763e12c5d1SDavid du Colombier acc = 0; 5773e12c5d1SDavid du Colombier for (;;) { 5783e12c5d1SDavid du Colombier i = cbits(ii); 5793e12c5d1SDavid du Colombier switch (i) { 5803e12c5d1SDavid du Colombier default: 5813e12c5d1SDavid du Colombier break; 5823e12c5d1SDavid du Colombier case '+': 5833e12c5d1SDavid du Colombier ii = getch(); 5843e12c5d1SDavid du Colombier continue; 5853e12c5d1SDavid du Colombier case '-': 5863e12c5d1SDavid du Colombier neg = 1; 5873e12c5d1SDavid du Colombier ii = getch(); 5883e12c5d1SDavid du Colombier continue; 5893e12c5d1SDavid du Colombier case '|': 5903e12c5d1SDavid du Colombier abs = 1 + neg; 5913e12c5d1SDavid du Colombier neg = 0; 5923e12c5d1SDavid du Colombier ii = getch(); 5933e12c5d1SDavid du Colombier continue; 5943e12c5d1SDavid du Colombier } 5953e12c5d1SDavid du Colombier break; 5963e12c5d1SDavid du Colombier } 5973e12c5d1SDavid du Colombier a1: 5983e12c5d1SDavid du Colombier while (i >= '0' && i <= '9') { 5993e12c5d1SDavid du Colombier field++; 6003e12c5d1SDavid du Colombier digits++; 6013e12c5d1SDavid du Colombier acc = 10 * acc + i - '0'; 6023e12c5d1SDavid du Colombier ii = getch(); 6033e12c5d1SDavid du Colombier i = cbits(ii); 6043e12c5d1SDavid du Colombier } 605*219b2ee8SDavid du Colombier if (i == '.' && !decpnt++) { 6063e12c5d1SDavid du Colombier field++; 6073e12c5d1SDavid du Colombier digits = 0; 6083e12c5d1SDavid du Colombier ii = getch(); 6093e12c5d1SDavid du Colombier i = cbits(ii); 6103e12c5d1SDavid du Colombier goto a1; 6113e12c5d1SDavid du Colombier } 6123e12c5d1SDavid du Colombier if (!field) { 6133e12c5d1SDavid du Colombier ch = ii; 6143e12c5d1SDavid du Colombier goto a2; 6153e12c5d1SDavid du Colombier } 6163e12c5d1SDavid du Colombier switch (i) { 6173e12c5d1SDavid du Colombier case 'u': 6183e12c5d1SDavid du Colombier i = j = 1; /* should this be related to HOR?? */ 6193e12c5d1SDavid du Colombier break; 6203e12c5d1SDavid du Colombier case 'v': /*VSs - vert spacing*/ 6213e12c5d1SDavid du Colombier j = lss; 6223e12c5d1SDavid du Colombier i = 1; 6233e12c5d1SDavid du Colombier break; 6243e12c5d1SDavid du Colombier case 'm': /*Ems*/ 6253e12c5d1SDavid du Colombier j = EM; 6263e12c5d1SDavid du Colombier i = 1; 6273e12c5d1SDavid du Colombier break; 6283e12c5d1SDavid du Colombier case 'n': /*Ens*/ 6293e12c5d1SDavid du Colombier j = EM; 6303e12c5d1SDavid du Colombier if (TROFF) 6313e12c5d1SDavid du Colombier i = 2; 6323e12c5d1SDavid du Colombier else 6333e12c5d1SDavid du Colombier i = 1; /*Same as Ems in NROFF*/ 6343e12c5d1SDavid du Colombier break; 6353e12c5d1SDavid du Colombier case 'p': /*Points*/ 6363e12c5d1SDavid du Colombier j = INCH; 6373e12c5d1SDavid du Colombier i = 72; 6383e12c5d1SDavid du Colombier break; 6393e12c5d1SDavid du Colombier case 'i': /*Inches*/ 6403e12c5d1SDavid du Colombier j = INCH; 6413e12c5d1SDavid du Colombier i = 1; 6423e12c5d1SDavid du Colombier break; 6433e12c5d1SDavid du Colombier case 'c': /*Centimeters*/ 6443e12c5d1SDavid du Colombier /* if INCH is too big, this will overflow */ 6453e12c5d1SDavid du Colombier j = INCH * 50; 6463e12c5d1SDavid du Colombier i = 127; 6473e12c5d1SDavid du Colombier break; 6483e12c5d1SDavid du Colombier case 'P': /*Picas*/ 6493e12c5d1SDavid du Colombier j = INCH; 6503e12c5d1SDavid du Colombier i = 6; 6513e12c5d1SDavid du Colombier break; 6523e12c5d1SDavid du Colombier default: 6533e12c5d1SDavid du Colombier j = dfact; 6543e12c5d1SDavid du Colombier ch = ii; 6553e12c5d1SDavid du Colombier i = dfactd; 6563e12c5d1SDavid du Colombier } 6573e12c5d1SDavid du Colombier if (neg) 6583e12c5d1SDavid du Colombier acc = -acc; 6593e12c5d1SDavid du Colombier if (!noscale) { 6603e12c5d1SDavid du Colombier acc = (acc * j) / i; 6613e12c5d1SDavid du Colombier } 6623e12c5d1SDavid du Colombier if (field != digits && digits > 0) 6633e12c5d1SDavid du Colombier while (digits--) 6643e12c5d1SDavid du Colombier acc /= 10; 6653e12c5d1SDavid du Colombier if (abs) { 6663e12c5d1SDavid du Colombier if (dip != d) 6673e12c5d1SDavid du Colombier j = dip->dnl; 6683e12c5d1SDavid du Colombier else 669*219b2ee8SDavid du Colombier j = numtabp[NL].val; 6703e12c5d1SDavid du Colombier if (!vflag) { 671*219b2ee8SDavid du Colombier j = numtabp[HP].val; 6723e12c5d1SDavid du Colombier } 6733e12c5d1SDavid du Colombier if (abs == 2) 6743e12c5d1SDavid du Colombier j = -j; 6753e12c5d1SDavid du Colombier acc -= j; 6763e12c5d1SDavid du Colombier } 6773e12c5d1SDavid du Colombier a2: 678*219b2ee8SDavid du Colombier nonumb = (!field || field == decpnt); 679*219b2ee8SDavid du Colombier if (nonumb && (trace & TRNARGS) && !ismot(ii) && !nlflg && !ifnum) { 680*219b2ee8SDavid du Colombier if (cbits(ii) != RIGHT ) /* Too painful to do right */ 681*219b2ee8SDavid du Colombier prnumerr(); 682*219b2ee8SDavid du Colombier } 6833e12c5d1SDavid du Colombier return(acc); 6843e12c5d1SDavid du Colombier } 6853e12c5d1SDavid du Colombier 6863e12c5d1SDavid du Colombier 6873e12c5d1SDavid du Colombier void caserr(void) 6883e12c5d1SDavid du Colombier { 6893e12c5d1SDavid du Colombier int i, j; 6903e12c5d1SDavid du Colombier Numtab *p; 6913e12c5d1SDavid du Colombier 6923e12c5d1SDavid du Colombier lgf++; 6933e12c5d1SDavid du Colombier while (!skip() && (i = getrq()) ) { 6943e12c5d1SDavid du Colombier j = usedr(i); 6953e12c5d1SDavid du Colombier if (j < 0) 6963e12c5d1SDavid du Colombier continue; 697*219b2ee8SDavid du Colombier p = &numtabp[j]; 6983e12c5d1SDavid du Colombier nunhash(p); 6993e12c5d1SDavid du Colombier p->r = p->val = p->inc = p->fmt = 0; 7003e12c5d1SDavid du Colombier regcnt--; 7013e12c5d1SDavid du Colombier } 7023e12c5d1SDavid du Colombier } 7033e12c5d1SDavid du Colombier 704*219b2ee8SDavid du Colombier /* 705*219b2ee8SDavid du Colombier * .nr request; if tracing, don't check optional 706*219b2ee8SDavid du Colombier * 2nd argument because tbl generates .in 1.5n 707*219b2ee8SDavid du Colombier */ 7083e12c5d1SDavid du Colombier void casenr(void) 7093e12c5d1SDavid du Colombier { 7103e12c5d1SDavid du Colombier int i, j; 711*219b2ee8SDavid du Colombier int savtr = trace; 7123e12c5d1SDavid du Colombier 7133e12c5d1SDavid du Colombier lgf++; 7143e12c5d1SDavid du Colombier skip(); 7153e12c5d1SDavid du Colombier if ((i = findr(getrq())) == -1) 7163e12c5d1SDavid du Colombier goto rtn; 7173e12c5d1SDavid du Colombier skip(); 718*219b2ee8SDavid du Colombier j = inumb(&numtabp[i].val); 7193e12c5d1SDavid du Colombier if (nonumb) 7203e12c5d1SDavid du Colombier goto rtn; 721*219b2ee8SDavid du Colombier numtabp[i].val = j; 7223e12c5d1SDavid du Colombier skip(); 723*219b2ee8SDavid du Colombier trace = 0; 7243e12c5d1SDavid du Colombier j = atoi0(); /* BUG??? */ 725*219b2ee8SDavid du Colombier trace = savtr; 7263e12c5d1SDavid du Colombier if (nonumb) 7273e12c5d1SDavid du Colombier goto rtn; 728*219b2ee8SDavid du Colombier numtabp[i].inc = j; 7293e12c5d1SDavid du Colombier rtn: 7303e12c5d1SDavid du Colombier return; 7313e12c5d1SDavid du Colombier } 7323e12c5d1SDavid du Colombier 7333e12c5d1SDavid du Colombier void caseaf(void) 7343e12c5d1SDavid du Colombier { 7353e12c5d1SDavid du Colombier int i, k; 7363e12c5d1SDavid du Colombier Tchar j; 7373e12c5d1SDavid du Colombier 7383e12c5d1SDavid du Colombier lgf++; 7393e12c5d1SDavid du Colombier if (skip() || !(i = getrq()) || skip()) 7403e12c5d1SDavid du Colombier return; 7413e12c5d1SDavid du Colombier k = 0; 7423e12c5d1SDavid du Colombier j = getch(); 7433e12c5d1SDavid du Colombier if (!isalpha(cbits(j))) { 7443e12c5d1SDavid du Colombier ch = j; 7453e12c5d1SDavid du Colombier while ((j = cbits(getch())) >= '0' && j <= '9') 7463e12c5d1SDavid du Colombier k++; 7473e12c5d1SDavid du Colombier } 7483e12c5d1SDavid du Colombier if (!k) 7493e12c5d1SDavid du Colombier k = j; 750*219b2ee8SDavid du Colombier numtabp[findr(i)].fmt = k; /* was k & BYTEMASK */ 7513e12c5d1SDavid du Colombier } 7523e12c5d1SDavid du Colombier 7533e12c5d1SDavid du Colombier void setaf(void) /* return format of number register */ 7543e12c5d1SDavid du Colombier { 7553e12c5d1SDavid du Colombier int i, j; 7563e12c5d1SDavid du Colombier 7573e12c5d1SDavid du Colombier i = usedr(getsn()); 7583e12c5d1SDavid du Colombier if (i == -1) 7593e12c5d1SDavid du Colombier return; 760*219b2ee8SDavid du Colombier if (numtabp[i].fmt > 20) /* it was probably a, A, i or I */ 761*219b2ee8SDavid du Colombier *pbp++ = numtabp[i].fmt; 7623e12c5d1SDavid du Colombier else 763*219b2ee8SDavid du Colombier for (j = (numtabp[i].fmt ? numtabp[i].fmt : 1); j; j--) 7643e12c5d1SDavid du Colombier *pbp++ = '0'; 7653e12c5d1SDavid du Colombier } 7663e12c5d1SDavid du Colombier 7673e12c5d1SDavid du Colombier 7683e12c5d1SDavid du Colombier int vnumb(int *i) 7693e12c5d1SDavid du Colombier { 7703e12c5d1SDavid du Colombier vflag++; 7713e12c5d1SDavid du Colombier dfact = lss; 7723e12c5d1SDavid du Colombier res = VERT; 7733e12c5d1SDavid du Colombier return(inumb(i)); 7743e12c5d1SDavid du Colombier } 7753e12c5d1SDavid du Colombier 7763e12c5d1SDavid du Colombier 7773e12c5d1SDavid du Colombier int hnumb(int *i) 7783e12c5d1SDavid du Colombier { 7793e12c5d1SDavid du Colombier dfact = EM; 7803e12c5d1SDavid du Colombier res = HOR; 7813e12c5d1SDavid du Colombier return(inumb(i)); 7823e12c5d1SDavid du Colombier } 7833e12c5d1SDavid du Colombier 7843e12c5d1SDavid du Colombier 7853e12c5d1SDavid du Colombier int inumb(int *n) 7863e12c5d1SDavid du Colombier { 7873e12c5d1SDavid du Colombier int i, j, f; 7883e12c5d1SDavid du Colombier Tchar ii; 7893e12c5d1SDavid du Colombier 7903e12c5d1SDavid du Colombier f = 0; 7913e12c5d1SDavid du Colombier if (n) { 7923e12c5d1SDavid du Colombier if ((j = cbits(ii = getch())) == '+') 7933e12c5d1SDavid du Colombier f = 1; 7943e12c5d1SDavid du Colombier else if (j == '-') 7953e12c5d1SDavid du Colombier f = -1; 7963e12c5d1SDavid du Colombier else 7973e12c5d1SDavid du Colombier ch = ii; 7983e12c5d1SDavid du Colombier } 7993e12c5d1SDavid du Colombier i = atoi0(); 8003e12c5d1SDavid du Colombier if (n && f) 8013e12c5d1SDavid du Colombier i = *n + f * i; 8023e12c5d1SDavid du Colombier i = quant(i, res); 8033e12c5d1SDavid du Colombier vflag = 0; 8043e12c5d1SDavid du Colombier res = dfactd = dfact = 1; 8053e12c5d1SDavid du Colombier if (nonumb) 8063e12c5d1SDavid du Colombier i = 0; 8073e12c5d1SDavid du Colombier return(i); 8083e12c5d1SDavid du Colombier } 8093e12c5d1SDavid du Colombier 8103e12c5d1SDavid du Colombier 8113e12c5d1SDavid du Colombier int quant(int n, int m) 8123e12c5d1SDavid du Colombier { 8133e12c5d1SDavid du Colombier int i, neg; 8143e12c5d1SDavid du Colombier 8153e12c5d1SDavid du Colombier neg = 0; 8163e12c5d1SDavid du Colombier if (n < 0) { 8173e12c5d1SDavid du Colombier neg++; 8183e12c5d1SDavid du Colombier n = -n; 8193e12c5d1SDavid du Colombier } 8203e12c5d1SDavid du Colombier /* better as i = ((n + m/2)/m)*m */ 8213e12c5d1SDavid du Colombier i = n / m; 8223e12c5d1SDavid du Colombier if (n - m * i > m / 2) 8233e12c5d1SDavid du Colombier i += 1; 8243e12c5d1SDavid du Colombier i *= m; 8253e12c5d1SDavid du Colombier if (neg) 8263e12c5d1SDavid du Colombier i = -i; 8273e12c5d1SDavid du Colombier return(i); 8283e12c5d1SDavid du Colombier } 829