From: Nick Porter Date: Thu, 24 Sep 2020 16:34:13 +0000 (+0100) Subject: Add prepend operator ^= X-Git-Tag: release_3_0_22~372 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92f79fea7ed47e88d88080be7779bc6c8eb96360;p=thirdparty%2Ffreeradius-server.git Add prepend operator ^= 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. --- diff --git a/src/include/token.h b/src/include/token.h index 6cbd05217a6..c8bb748702f 100644 --- a/src/include/token.h +++ b/src/include/token.h @@ -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; diff --git a/src/lib/token.c b/src/lib/token.c index 8ae41b392f3..c019143a39d 100644 --- a/src/lib/token.c +++ b/src/lib/token.c @@ -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