]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
move to switch statements / arrays
authorAlan T. DeKok <aland@freeradius.org>
Sun, 10 Jan 2021 19:33:53 +0000 (14:33 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 10 Jan 2021 19:33:53 +0000 (14:33 -0500)
so that types don't need to be ordered

src/lib/server/cond_tokenize.c
src/lib/util/types.h
src/lib/util/value.c

index d868d826bed7b06f1f2c2f050f0155cbe1889718..b2b88abe1af2204b6eb5afcd76a864696cd359c5 100644 (file)
@@ -458,7 +458,11 @@ set_types:
                case T_OP_LE:
                case T_OP_GT:
                case T_OP_GE:
-                       cast_type++; /* addr -> prefix */
+                       if (cast_type == FR_TYPE_IPV4_ADDR) {
+                               cast_type = FR_TYPE_IPV4_PREFIX;
+                       } else {
+                               cast_type = FR_TYPE_IPV6_PREFIX;
+                       }
                        break;
                }
        }
index 7edd22040f0066a882c57f2ff41d7779e441fb03..b35f493e2b5632f1ea7f43b6b8650006807c09bf 100644 (file)
@@ -29,9 +29,7 @@ RCSIDH(types_h, "$Id$")
 extern "C" {
 #endif
 
-/** Internal data types used within libfreeradius
- *
- *  Order is important!  Please see fr_type_promote() for details.
+/** Internal data types
  */
 typedef enum {
        FR_TYPE_INVALID = 0,                    //!< Invalid (uninitialised) attribute type.
index 9aba3742a2cfaf3397da8be2891538c1f381832e..e91aa4305690922fc1cbad5dc993db8afa6ef69b 100644 (file)
@@ -5237,6 +5237,18 @@ static const bool type_cast_table[FR_TYPE_MAX][FR_TYPE_MAX] = {
 
 };
 
+/*
+ *     This is different from FR_TYPE_NUMERIC, largely in that it
+ *     doesn't include FR_TYPE_DATE.  Because we know that dates
+ *     always have values 2^31 or greater, so casts exclude some of
+ *     the smaller integer types.
+ */
+static const bool type_is_number[FR_TYPE_MAX] = {
+       O(BOOL),  O(SIZE),   O(FLOAT32), O(FLOAT64),
+       O(UINT8), O(UINT16), O(UINT32), O(UINT64),
+       O(INT8),  O(INT16),  O(INT32),  O(INT64),
+       O(TIME_DELTA),
+};
 
 /** Return if we're allowed to cast the types.
  *
@@ -5249,8 +5261,21 @@ bool fr_type_cast(fr_type_t dst, fr_type_t src)
        /*
         *      Invalid casts.
         */
-       if ((dst == FR_TYPE_INVALID) || (src >= FR_TYPE_TLV)) return false;
-       if ((src == FR_TYPE_INVALID) || (dst >= FR_TYPE_TLV)) return false;
+       switch (dst) {
+       case FR_TYPE_NON_VALUES:
+               return false;
+
+       default:
+               break;
+       }
+
+       switch (src) {
+       case FR_TYPE_NON_VALUES:
+               return false;
+
+       default:
+               break;
+       }
 
        if (src == dst) return true;
 
@@ -5272,8 +5297,7 @@ bool fr_type_cast(fr_type_t dst, fr_type_t src)
         *      integer-style thing.  Mostly.  We do run-time checks
         *      on values to see if they fit.
         */
-       if (((src >= FR_TYPE_BOOL) && (src <= FR_TYPE_TIME_DELTA)) &&
-           ((dst >= FR_TYPE_BOOL) && (dst <= FR_TYPE_TIME_DELTA))) {
+       if (type_is_number[src] && type_is_number[dst]) {
                return true;
        }
 
@@ -5518,8 +5542,21 @@ fr_type_t fr_type_promote(fr_type_t a, fr_type_t b)
        /*
         *      Invalid types
         */
-       if ((a == FR_TYPE_INVALID) || (a >= FR_TYPE_TLV)) return FR_TYPE_INVALID;
-       if ((b == FR_TYPE_INVALID) || (b >= FR_TYPE_TLV)) return FR_TYPE_INVALID;
+       switch (a) {
+       case FR_TYPE_NON_VALUES:
+               return FR_TYPE_INVALID;
+
+       default:
+               break;
+       }
+
+       switch (b) {
+       case FR_TYPE_NON_VALUES:
+               return FR_TYPE_INVALID;
+
+       default:
+               break;
+       }
 
        if (a == b) return a;