+ if(abs(val) > INT_MAX/7)
+ parserror("value too large");
+ val *= 7;
+ break;
+ case MULT1M:
+ if(abs(val) > INT_MAX/1024)
+ parserror("value too large");
+ val *= 1024;
+ break;
+ case MULT1G:
+ if(abs(val) > INT_MAX/(1024*1024))
+ parserror("value too large");
+ val *= 1024*1024;
+ break;
+ default: /* it was not a multiplier */
+ unget_conftoken();
+ }
+
+ keytable = save_kt;
+
+ return val;
+}
+
+static long get_long()
+{
+ long val;
+ keytab_t *save_kt;
+
+ save_kt = keytable;
+ keytable = numb_keytable;
+
+ get_conftoken(ANY);
+
+ switch(tok) {
+ case AM64:
+ if(tokenval.am64 > LONG_MAX || tokenval.am64 < LONG_MIN)
+ parserror("value too large");
+ val = (long) tokenval.am64;
+ break;
+ case INFINITY:
+ val = (long) LONG_MAX;
+ break;
+ default:
+ parserror("a long expected");
+ val = 0;
+ }
+
+ /* get multiplier, if any */
+ get_conftoken(ANY);
+
+ switch(tok) {
+ case NL: /* multiply by one */
+ case MULT1:
+ case MULT1K:
+ break;
+ case MULT7:
+ if(val > LONG_MAX/7 || val < LONG_MIN/7)
+ parserror("value too large");
+ val *= 7;
+ break;
+ case MULT1M:
+ if(val > LONG_MAX/1024 || val < LONG_MIN/7)
+ parserror("value too large");
+ val *= 1024;
+ break;
+ case MULT1G:
+ if(val > LONG_MAX/(1024*1024) || val < LONG_MIN/(1024*1024))
+ parserror("value too large");
+ val *= 1024*1024;
+ break;
+ default: /* it was not a multiplier */
+ unget_conftoken();
+ }
+
+ keytable = save_kt;
+
+ return val;
+}
+
+static am64_t get_am64_t()
+{
+ am64_t val;
+ keytab_t *save_kt;
+
+ save_kt = keytable;
+ keytable = numb_keytable;
+
+ get_conftoken(ANY);
+
+ switch(tok) {
+ case AM64:
+ val = tokenval.am64;
+ break;
+ case INFINITY:
+ val = AM64_MAX;
+ break;
+ default:
+ parserror("a am64 expected %d", tok);
+ val = 0;
+ }
+
+ /* get multiplier, if any */
+ get_conftoken(ANY);
+
+ switch(tok) {
+ case NL: /* multiply by one */
+ case MULT1:
+ case MULT1K:
+ break;
+ case MULT7:
+ if(val > AM64_MAX/7 || val < AM64_MIN/7)
+ parserror("value too large");