|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: #include "bc.h" ! 4: ! 5: ! 6: /* ! 7: * Getnum reads in a number from standard input. It allows ! 8: * decimal points and sets the scale field of the number accordingly. ! 9: * In addition, although the default base is ibase, it recognizes ! 10: * the C conventions of leading `0' for base 8 and `0x' for base ! 11: * 16. ! 12: */ ! 13: ! 14: rvalue * ! 15: getnum(ch) ! 16: register int ch; ! 17: { ! 18: register rvalue *result; ! 19: register FILE *inf = infile; ! 20: mint dig; ! 21: int val, ! 22: dot, ! 23: base = ibase; ! 24: ! 25: result = (rvalue *)mpalc(sizeof *result); ! 26: newscalar(result); ! 27: minit(&dig); ! 28: if (ch == '0' && (ch = getc(inf)) != '.') ! 29: if (ch == 'x') { ! 30: ch = getc(inf); ! 31: base = 16; ! 32: } else ! 33: base = 8; ! 34: for (dot = FALSE;; ch = getc(inf)) { ! 35: if (!isascii(ch)) ! 36: break; ! 37: else if (isdigit(ch)) ! 38: val = ch - '0'; ! 39: else if ('A' <= ch && ch <= 'F') ! 40: val = ch + 0xA - 'A'; ! 41: else if ('a' <= ch && ch <= 'f') ! 42: val = ch + 0xA - 'a'; ! 43: else if (ch == '.' & !dot) { ! 44: dot = TRUE; ! 45: continue; ! 46: } else ! 47: break; ! 48: mitom(val, &dig); ! 49: smult(&result->mantissa, base, &result->mantissa); ! 50: madd(&result->mantissa, &dig, &result->mantissa); ! 51: if (dot) ! 52: ++result->scale; ! 53: } ! 54: ungetc(ch, inf); ! 55: mvfree(&dig); ! 56: return (result); ! 57: } ! 58: ! 59: ! 60: /* ! 61: * Sibase takes the rvalue pointed to by lval and set ibase ! 62: * to it if it is in range (ie. between 2 and 16). ! 63: */ ! 64: ! 65: sibase(lval) ! 66: rvalue *lval; ! 67: { ! 68: register int base; ! 69: ! 70: base = rtoint(lval); ! 71: if (2 > base || base > 16) ! 72: bcmerr("Invalid input base"); ! 73: ibase = base; ! 74: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.