From: Willy Tarreau Date: Sun, 18 Jul 2010 08:40:48 +0000 (+0200) Subject: [MINOR] tools: add a get_std_op() function to parse operators X-Git-Tag: v1.5-dev8~538 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b1802020126d10cb1ac3f84fc851fd00f207c9c;p=thirdparty%2Fhaproxy.git [MINOR] tools: add a get_std_op() function to parse operators We already have several places where we use operators to compare values. Each time the parsing is done again. Let's have a central function for this. --- diff --git a/include/common/standard.h b/include/common/standard.h index fcfb52f8bc..cb5a3ec56b 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -42,6 +42,15 @@ * power of 2, and 0 otherwise */ #define POWEROF2(x) (((x) & ((x)-1)) == 0) +/* operators to compare values. They're ordered that way so that the lowest bit + * serves as a negation for the test and contains all tests that are not equal. + */ +enum { + STD_OP_LE = 0, STD_OP_GT = 1, + STD_OP_EQ = 2, STD_OP_NE = 3, + STD_OP_GE = 4, STD_OP_LT = 5, +}; + /* * copies at most chars from to . Last char is always * set to 0, unless is 0. The number of chars copied is returned @@ -407,4 +416,7 @@ int buf2ip(const char *buf, size_t len, struct in_addr *dst); */ const char *quote_arg(const char *ptr); +/* returns an operator among STD_OP_* for string or < 0 if unknown */ +int get_std_op(const char *str); + #endif /* _COMMON_STANDARD_H */ diff --git a/src/standard.c b/src/standard.c index 12954b0c7c..8aaa594dad 100644 --- a/src/standard.c +++ b/src/standard.c @@ -1078,6 +1078,29 @@ const char *quote_arg(const char *ptr) return val; } +/* returns an operator among STD_OP_* for string or < 0 if unknown */ +int get_std_op(const char *str) +{ + int ret = -1; + + if (*str == 'e' && str[1] == 'q') + ret = STD_OP_EQ; + else if (*str == 'n' && str[1] == 'e') + ret = STD_OP_NE; + else if (*str == 'l') { + if (str[1] == 'e') ret = STD_OP_LE; + else if (str[1] == 't') ret = STD_OP_LT; + } + else if (*str == 'g') { + if (str[1] == 'e') ret = STD_OP_GE; + else if (str[1] == 't') ret = STD_OP_GT; + } + + if (ret == -1 || str[2] != '\0') + return -1; + return ret; +} + /* * Local variables: * c-indent-level: 8