+getnum(rdf) int (*rdf)();
+{
+ INT base,d,frpt;
+ BOOL hex;
+ UNION{REAL r; L_INT i;} real;
+ IF isdigit(lastc) ORF (hex=TRUE, lastc=='#' ANDF isxdigit((*rdf)()))
+ THEN expv = 0;
+ base = (hex ? 16 : radix);
+ WHILE (base>10 ? isxdigit(lastc) : isdigit(lastc))
+ DO expv = (base==16 ? expv<<4 : expv*base);
+ IF (d=convdig(lastc))>=base THEN error(BADSYN); FI
+ expv += d; (*rdf)();
+ IF expv==0
+ THEN IF (lastc=='x' ORF lastc=='X')
+ THEN hex=TRUE; base=16; (*rdf)();
+ ELIF (lastc=='t' ORF lastc=='T')
+ THEN hex=FALSE; base=10; (*rdf)();
+ ELIF (lastc=='o' ORF lastc=='O')
+ THEN hex=FALSE; base=8; (*rdf)();
+ FI
+ FI
+ OD
+ IF lastc=='.' ANDF (base==10 ORF expv==0) ANDF !hex
+ THEN real.r=expv; frpt=0; base=10;
+ WHILE isdigit((*rdf)())
+ DO real.r *= base; frpt++;
+ real.r += lastc-'0';
+ OD
+ WHILE frpt--
+ DO real.r /= base; OD
+ expv = real.i;
+ FI
+ peekc=lastc;
+/* lp--; */
+ return(1);
+ ELSE return(0);
+ FI
+}