+int
+POL::getnumber
+(
+ char str[], /* string to return token in */
+ int strsize, /* maximum length of token string */
+ double *fnum, /* floating point value of number read */
+ int *inum /* integer value of number read */
+ )
+{
+ int sp = 0;
+ double sign = 1.0;
+ bool isSigned = false; /* true if number prefixed by '+' or '-' */
+ *fnum = 0.0;
+ *inum = 0;
+ str[0] = EOS;
+
+ int c = inchar();
+ if (c == HYPHEN) {
+ str[sp++] = c;
+ isSigned = true;
+ sign = -1.0;
+ } else if (c == PLUS) {
+ str[sp++] = c;
+ isSigned = true;
+ sign = 1.0;
+ } else if (c == PERIOD) {
+ if (type(lookchar()) != DIGIT) {
+ str[0] = PERIOD;
+ str[1] = EOS;
+ return (TT_SPECLCHAR);
+ } else
+ ungetch (PERIOD);
+ } else if (type(c) != DIGIT) {
+ ungetch (c);
+ return (TT_ERROR);
+ } else
+ ungetch (c);
+
+ if (isSigned) {
+ c = lookchar();
+ if (c == PERIOD) {
+ inchar(); /* get period */
+ c = lookchar(); /* look at character past period */
+ ungetch (PERIOD); /* put back period */
+ if (type(c) != DIGIT) {
+ str[sp] = EOS;
+ return (TT_SPECLCHAR);
+ }
+ } else if (type (c) != DIGIT) {
+ str[sp] = EOS;
+ return (TT_SPECLCHAR);
+ }
+ }
+
+ double whole = 0.0;
+ while (type(c = inchar()) == DIGIT) {
+ if (sp < strsize)
+ str[sp++] = c;
+ whole = 10.0 * whole + (c - '0');
+ }
+ ungetch (c); /* put back non-numeric character */
+
+ if (c != PERIOD && tolower(c) != 'e') {
+ str[sp] = EOS;
+ *fnum = whole * sign;
+ if (*fnum < MIN_INT)
+ *inum = MIN_INT;
+ else if (*fnum > MAX_INT)
+ *inum = MAX_INT;
+ else
+ *inum = (int) *fnum;
+ return (TT_INT);
+ }
+
+ if (lookchar() == PERIOD) {
+ inchar();
+ if (sp < strsize)
+ str[sp++] = PERIOD;
+ }
+
+ double frac = 0.0;
+ double powerof10 = 10.0;
+
+ while (type(c = inchar()) == DIGIT) {
+ if (sp < strsize)
+ str[sp++] = c;
+ frac += (double) (c - '0') / powerof10;
+ powerof10 *= 10.0;
+ }
+ ungetch (c);
+
+ double exp = 0.0;
+ double expsign = 1.0;
+ c = inchar();
+ if (tolower(c) != 'e')
+ ungetch (c);
+ else {
+ if (sp < strsize)
+ str[sp++] = c;
+ if ((c = inchar()) == PLUS) {
+ if (sp < strsize)
+ str[sp++] = c;
+ expsign = 1.0;
+ } else if (c == HYPHEN) {
+ if (sp < strsize)
+ str[sp++] = c;
+ expsign = -1.0;
+ } else if (type(c) != DIGIT) {
+ --sp; /* erase 'e' */
+ ungetch (c);
+ ungetch ('e');
+ goto getnumexit;
+ } else
+ ungetch(c);
+
+ exp = 0;
+ while (type(c = inchar()) == DIGIT) {
+ if (sp < strsize)
+ str[sp++] = c;
+ exp = 10 * exp + (c - '0');
+ }
+ ungetch (c);
+ }
+