]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add prepend operator ^=
authorNick Porter <nick@portercomputing.co.uk>
Thu, 24 Sep 2020 16:34:13 +0000 (17:34 +0100)
committerAlan DeKok <aland@freeradius.org>
Wed, 14 Oct 2020 14:53:37 +0000 (10:53 -0400)
To be used in attribute assignement to get the new attribute prepended
to the list.

Beneficial in DHCP where the order of multiple instances of an attribute
is significant.

src/include/token.h
src/lib/token.c

index 6cbd05217a6c79ea33676c86448560744a746d30..c8bb748702f1f90cfb550ea10c23a99ffd88ff40 100644 (file)
@@ -56,16 +56,17 @@ typedef enum fr_token_t {
        T_OP_CMP_TRUE,                  /* =*           20 */
        T_OP_CMP_FALSE,                 /* !* */
        T_OP_CMP_EQ,                    /* == */
+       T_OP_PREPEND,                   /* ^= */
        T_HASH,                         /* # */
-       T_BARE_WORD,                    /* bare word */
-       T_DOUBLE_QUOTED_STRING,         /* "foo"        25 */
+       T_BARE_WORD,                    /* bare word    25 */
+       T_DOUBLE_QUOTED_STRING,         /* "foo" */
        T_SINGLE_QUOTED_STRING,         /* 'foo' */
        T_BACK_QUOTED_STRING,           /* `foo` */
        T_TOKEN_LAST
 } FR_TOKEN;
 
 #define T_EQSTART      T_OP_ADD
-#define        T_EQEND         (T_OP_CMP_EQ + 1)
+#define        T_EQEND         (T_OP_PREPEND + 1)
 
 typedef struct FR_NAME_NUMBER {
        char const      *name;
index 8ae41b392f34a0362c12190d801fac74ac5e6f71..c019143a39d449285f7fde53cfd73f34cdac1dbf 100644 (file)
@@ -42,6 +42,7 @@ const FR_NAME_NUMBER fr_tokens[] = {
        { "=*", T_OP_CMP_TRUE,  },
        { "!*", T_OP_CMP_FALSE, },
        { "==", T_OP_CMP_EQ,    },
+       { "^=", T_OP_PREPEND,   },
        { "=",  T_OP_EQ,        },
        { "!=", T_OP_NE,        },
        { ">=", T_OP_GE,        },
@@ -67,20 +68,21 @@ const bool fr_assignment_op[] = {
        true,           /* += */
        true,           /* -=           10 */
        true,           /* := */
+       true,           /* ^= */
        true,           /* = */
        false,          /* != */
-       false,          /* >= */
-       false,          /* >            15 */
+       false,          /* >=           15 */
+       false,          /* > */
        false,          /* <= */
        false,          /* < */
        false,          /* =~ */
-       false,          /* !~ */
-       false,          /* =*           20 */
+       false,          /* !~           20 */
+       false,          /* =* */
        false,          /* !* */
        false,          /* == */
-       false,                          /* # */
-       false,          /* bare word */
-       false,          /* "foo"        25 */
+       false,          /* # */
+       false,          /* bare word    25 */
+       false,          /* "foo" */
        false,          /* 'foo' */
        false,          /* `foo` */
        false
@@ -100,20 +102,21 @@ const bool fr_equality_op[] = {
        false,          /* += */
        false,          /* -=           10 */
        false,          /* := */
+       false,          /* ^= */
        false,          /* = */
        true,           /* != */
-       true,           /* >= */
-       true,           /* >            15 */
+       true,           /* >=           15 */
+       true,           /* > */
        true,           /* <= */
        true,           /* < */
        true,           /* =~ */
-       true,           /* !~ */
-       true,           /* =*           20 */
+       true,           /* !~           20 */
+       true,           /* =* */
        true,           /* !* */
        true,           /* == */
-       false,                          /* # */
-       false,          /* bare word */
-       false,          /* "foo"        25 */
+       false,          /* # */
+       false,          /* bare word    25 */
+       false,          /* "foo" */
        false,          /* 'foo' */
        false,          /* `foo` */
        false
@@ -133,20 +136,21 @@ const bool fr_str_tok[] = {
        false,          /* += */
        false,          /* -=           10 */
        false,          /* := */
+       false,          /* ^= */
        false,          /* = */
        false,          /* != */
-       false,          /* >= */
-       false,          /* >            15 */
+       false,          /* >=           15 */
+       false,          /* > */
        false,          /* <= */
        false,          /* < */
        false,          /* =~ */
-       false,          /* !~ */
-       false,          /* =*           20 */
+       false,          /* !~           20 */
+       false,          /* =* */
        false,          /* !* */
        false,          /* == */
-       false,                          /* # */
-       true,           /* bare word */
-       true,           /* "foo"        25 */
+       false,          /* # */
+       true,           /* bare word    25 */
+       true,           /* "foo" */
        true,           /* 'foo' */
        true,           /* `foo` */
        false