|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 1347 (0x543) Types: TextFile Notes: UNIX file Names: »getnum.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─ ⟦this⟧ »cmd/bc/getnum.c«
#include <stdio.h> #include <ctype.h> #include "bc.h" /* * Getnum reads in a number from standard input. It allows * decimal points and sets the scale field of the number accordingly. * In addition, although the default base is ibase, it recognizes * the C conventions of leading `0' for base 8 and `0x' for base * 16. */ rvalue * getnum(ch) register int ch; { register rvalue *result; register FILE *inf = infile; mint dig; int val, dot, base = ibase; result = (rvalue *)mpalc(sizeof *result); newscalar(result); minit(&dig); if (ch == '0' && (ch = getc(inf)) != '.') if (ch == 'x') { ch = getc(inf); base = 16; } else base = 8; for (dot = FALSE;; ch = getc(inf)) if (isascii(ch)&&isdigit(ch) || 'A'<=ch&&ch<='F') { val = isdigit(ch) ? ch-'0' : ch+0xA-'A'; mitom(val, &dig); smult(&result->mantissa, base, &result->mantissa); madd(&result->mantissa, &dig, &result->mantissa); if (dot) ++result->scale; } else if (ch == '.' & !dot) dot = TRUE; else break; ungetc(ch, inf); mvfree(&dig); return (result); } /* * Sibase takes the rvalue pointed to by lval and set ibase * to it if it is in range (ie. between 2 and 16). */ sibase(lval) rvalue *lval; { register int base; base = rtoint(lval); if (2 > base || base > 16) bcmerr("Invalid input base"); ibase = base; }