From 409ace23eaa92a05f2f9289f7e9a69d6b0c3f821 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 15 May 2017 20:39:51 -0700 Subject: less table robust against type renumbering. * lib.c (less_tab_init): The type_prec table initialization will become incorrect if new type enums are added other than at the end. Let's switch to assignments. Anything not mentioned is zero. * lib.h: Add more advice to comment about extending type_t: consider all places where MAX_TYPE is used. --- lib.c | 33 ++++++++++++++------------------- lib.h | 2 +- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/lib.c b/lib.c index 6939f817..7e79297a 100644 --- a/lib.c +++ b/lib.c @@ -4406,25 +4406,20 @@ static enum less_handling less_tab[MAXTYPE+1][MAXTYPE+1]; static void less_tab_init(void) { int l, r; - static int type_prec[MAXTYPE+1] = { - 4, /* NIL */ - 1, /* NUM */ - 1, /* CHR */ - 3, /* LIT */ - 5, /* CONS */ - 3, /* STR */ - 4, /* SYM */ - 0, /* PKG */ - 0, /* FUN */ - 6, /* VEC */ - 5, /* LCONS */ - 3, /* LSTR */ - 0, /* COBJ */ - 0, /* ENV */ - 1, /* BGNUM */ - 1, /* FLNUM */ - 2, /* RNG */ - }; + static int type_prec[MAXTYPE+1]; + + type_prec[NIL] = 4; + type_prec[NUM] = 1; + type_prec[CHR] = 1; + type_prec[LIT] = 3; + type_prec[CONS] = 5; + type_prec[STR] = 3; + type_prec[SYM] = 4; + type_prec[LCONS] = 5; + type_prec[LSTR] = 3; + type_prec[BGNUM] = 1; + type_prec[FLNUM] = 1; + type_prec[RNG] = 2; for (l = 0; l <= MAXTYPE; l++) for (r = 0; r <= MAXTYPE; r++) { diff --git a/lib.h b/lib.h index 301e46c4..04440b39 100644 --- a/lib.h +++ b/lib.h @@ -61,7 +61,7 @@ typedef enum type { NIL = TAG_PTR, NUM = TAG_NUM, CHR = TAG_CHR, LIT = TAG_LIT, CONS, STR, SYM, PKG, FUN, VEC, LCONS, LSTR, COBJ, ENV, BGNUM, FLNUM, RNG, BUF, MAXTYPE = BUF - /* If extending, check TYPE_SHIFT */ + /* If extending, check TYPE_SHIFT and all ocurrences of MAX_TYPE */ } type_t; #define TYPE_SHIFT 5 -- cgit v1.2.3