#define BC_MAX(a, b) ((a) > (b) ? (a) : (b))
#define BC_MIN(a, b) ((a) < (b) ? (a) : (b))
-#define BC_MAX_OBASE ((unsigned) 999)
-#define BC_MAX_DIM ((unsigned) INT_MAX)
-#define BC_MAX_SCALE ((unsigned) UINT_MAX)
-#define BC_MAX_STRING ((unsigned) UINT_MAX - 1)
-#define BC_MAX_NAME BC_MAX_STRING
-#define BC_MAX_NUM BC_MAX_STRING
-#define BC_MAX_EXP ((unsigned long) LONG_MAX)
-#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1)
+#define BC_MAX_OBASE ((unsigned) 999)
+#define BC_MAX_DIM ((unsigned) INT_MAX)
+#define BC_MAX_SCALE ((unsigned) UINT_MAX)
+#define BC_MAX_STRING ((unsigned) UINT_MAX - 1)
+#define BC_MAX_NUM BC_MAX_STRING
+// Unused apart from "limits" message. Just show a "biggish number" there.
+//#define BC_MAX_NAME BC_MAX_STRING
+//#define BC_MAX_EXP ((unsigned long) LONG_MAX)
+//#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1)
+#define BC_MAX_NAME_STR "999999999"
+#define BC_MAX_EXP_STR "999999999"
+#define BC_MAX_VARS_STR "999999999"
+
+#define BC_MAX_OBASE_STR "999"
+
+#if INT_MAX == 2147483647
+# define BC_MAX_DIM_STR "2147483647"
+#elif INT_MAX == 9223372036854775807
+# define BC_MAX_DIM_STR "9223372036854775807"
+#else
+# error Strange INT_MAX
+#endif
+
+#if UINT_MAX == 4294967295
+# define BC_MAX_SCALE_STR "4294967295"
+# define BC_MAX_STRING_STR "4294967294"
+#elif UINT_MAX == 18446744073709551615
+# define BC_MAX_SCALE_STR "18446744073709551615"
+# define BC_MAX_STRING_STR "18446744073709551614"
+#else
+# error Strange UINT_MAX
+#endif
+#define BC_MAX_NUM_STR BC_MAX_STRING_STR
struct globals {
IF_FEATURE_BC_SIGNALS(smallint ttyin;)
static BcStatus bc_num_shift(BcNum *n, size_t places)
{
if (places == 0 || n->len == 0) return BC_STATUS_SUCCESS;
- if (places + n->len > BC_MAX_NUM)
- return bc_error("number too long: must be [1, BC_NUM_MAX]");
+
+ // This check makes sense only if size_t is (much) larger than BC_MAX_NUM.
+ if (SIZE_MAX > (BC_MAX_NUM | 0xff)) {
+ if (places + n->len > BC_MAX_NUM)
+ return bc_error("number too long: must be [1,"BC_MAX_NUM_STR"]");
+ }
if (n->rdx >= places)
n->rdx -= places;
}
len = i + !last_pt - bslashes * 2;
- if (len > BC_MAX_NUM)
- return bc_error("number too long: must be [1, BC_NUM_MAX]");
+ // This check makes sense only if size_t is (much) larger than BC_MAX_NUM.
+ if (SIZE_MAX > (BC_MAX_NUM | 0xff)) {
+ if (len > BC_MAX_NUM)
+ return bc_error("number too long: must be [1,"BC_MAX_NUM_STR"]");
+ }
bc_vec_pop_all(&l->t.v);
bc_vec_expand(&l->t.v, len + 1);
while ((c >= 'a' && c <= 'z') || isdigit(c) || c == '_') c = buf[++i];
- if (i > BC_MAX_STRING)
- return bc_error("name too long: must be [1, BC_NAME_MAX]");
+ // This check makes sense only if size_t is (much) larger than BC_MAX_STRING.
+ if (SIZE_MAX > (BC_MAX_STRING | 0xff)) {
+ if (i > BC_MAX_STRING)
+ return bc_error("name too long: must be [1,"BC_MAX_STRING_STR"]");
+ }
bc_vec_string(&l->t.v, i, buf);
// Increment the index. We minus 1 because it has already been incremented.
}
len = i - l->i;
- if (len > BC_MAX_STRING)
- return bc_error("string too long: must be [1, BC_STRING_MAX]");
+ // This check makes sense only if size_t is (much) larger than BC_MAX_STRING.
+ if (SIZE_MAX > (BC_MAX_STRING | 0xff)) {
+ if (len > BC_MAX_STRING)
+ return bc_error("string too long: must be [1,"BC_MAX_STRING_STR"]");
+ }
bc_vec_string(&l->t.v, len, l->buf + l->i);
l->i = i + 1;
}
bc_vec_pushZeroByte(&l->t.v);
- if (i - l->i > BC_MAX_STRING)
- return bc_error("string too long: must be [1, BC_STRING_MAX]");
+ // This check makes sense only if size_t is (much) larger than BC_MAX_STRING.
+ if (SIZE_MAX > (BC_MAX_STRING | 0xff)) {
+ if (i - l->i > BC_MAX_STRING)
+ return bc_error("string too long: must be [1,"BC_MAX_STRING_STR"]");
+ }
l->i = i;
l->line += nls;
// the output is produced at _parse time_.
s = bc_lex_next(&p->l);
if (s) return s;
- printf("BC_BASE_MAX = %u\n", BC_MAX_OBASE);
- printf("BC_DIM_MAX = %u\n", BC_MAX_DIM);
- printf("BC_SCALE_MAX = %u\n", BC_MAX_SCALE);
- printf("BC_STRING_MAX = %u\n", BC_MAX_STRING);
- printf("BC_NAME_MAX = %u\n", BC_MAX_NAME);
- printf("BC_NUM_MAX = %u\n", BC_MAX_NUM);
- printf("MAX Exponent = %lu\n", BC_MAX_EXP);
- printf("Number of vars = %lu\n", BC_MAX_VARS);
+ printf(
+ "BC_BASE_MAX = "BC_MAX_OBASE_STR "\n"
+ "BC_DIM_MAX = "BC_MAX_DIM_STR "\n"
+ "BC_SCALE_MAX = "BC_MAX_SCALE_STR "\n"
+ "BC_STRING_MAX = "BC_MAX_STRING_STR"\n"
+ "BC_NAME_MAX = "BC_MAX_NAME_STR "\n"
+ "BC_NUM_MAX = "BC_MAX_NUM_STR "\n"
+ "MAX Exponent = "BC_MAX_EXP_STR "\n"
+ "Number of vars = "BC_MAX_VARS_STR "\n"
+ );
break;
}
if (ib || sc || left->t == BC_RESULT_OBASE) {
static const char *const msg[] = {
- "bad ibase; must be [2, 16]", //BC_RESULT_IBASE
- "bad scale; must be [0, BC_SCALE_MAX]", //BC_RESULT_SCALE
- NULL, //can't happen //BC_RESULT_LAST
- NULL, //can't happen //BC_RESULT_CONSTANT
- NULL, //can't happen //BC_RESULT_ONE
- "bad obase; must be [2, BC_BASE_MAX]", //BC_RESULT_OBASE
+ "bad ibase; must be [2,16]", //BC_RESULT_IBASE
+ "bad scale; must be [0,"BC_MAX_SCALE_STR"]", //BC_RESULT_SCALE
+ NULL, //can't happen //BC_RESULT_LAST
+ NULL, //can't happen //BC_RESULT_CONSTANT
+ NULL, //can't happen //BC_RESULT_ONE
+ "bad obase; must be [2,"BC_MAX_OBASE_STR"]", //BC_RESULT_OBASE
};
size_t *ptr;
unsigned long val, max;
if (s) goto err;
if (temp > BC_MAX_DIM) {
- s = bc_error("array too long; must be [1, BC_DIM_MAX]");
+ s = bc_error("array too long; must be [1,"BC_MAX_DIM_STR"]");
goto err;
}