>From 37bbb5dd9c812c683ac712f859ae3aaca85e284c Mon Sep 17 00:00:00 2001 From: Marcin Szewczyk Date: Wed, 29 Jul 2020 23:42:19 +0200 Subject: [PATCH] add the "in" operator --- src/rec-sex-ast.h | 1 + src/rec-sex-lex.l | 1 + src/rec-sex-tab.y | 2 ++ src/rec-sex.c | 37 +++++++++++++++++++++++++++++++++++++ torture/utils/recsel.sh | 7 +++++++ 5 files changed, 48 insertions(+) diff --git a/src/rec-sex-ast.h b/src/rec-sex-ast.h index 0107075..0b0dce2 100644 --- a/src/rec-sex-ast.h +++ b/src/rec-sex-ast.h @@ -45,6 +45,7 @@ enum rec_sex_ast_node_type_e REC_SEX_OP_EQL, REC_SEX_OP_NEQ, REC_SEX_OP_MAT, + REC_SEX_OP_IN, REC_SEX_OP_LT, REC_SEX_OP_GT, REC_SEX_OP_LTE, diff --git a/src/rec-sex-lex.l b/src/rec-sex-lex.l index 5019dc3..4ae6ce4 100644 --- a/src/rec-sex-lex.l +++ b/src/rec-sex-lex.l @@ -123,6 +123,7 @@ STRING '([^']|\\(.|\n))*'|\"([^"]|\\(.|\n))*\" "!=" { return REC_SEX_TOK_NEQ; } "!" { return REC_SEX_TOK_NOT; } "~" { return REC_SEX_TOK_MAT; } +"in" { return REC_SEX_TOK_IN; } ">" { return REC_SEX_TOK_GT; } "<" { return REC_SEX_TOK_LT; } "(" { return REC_SEX_TOK_BP; } diff --git a/src/rec-sex-tab.y b/src/rec-sex-tab.y index 83e6ef0..35c006d 100644 --- a/src/rec-sex-tab.y +++ b/src/rec-sex-tab.y @@ -109,6 +109,7 @@ %left REC_SEX_TOK_SAMETIME REC_SEX_TOK_AFTER REC_SEX_TOK_BEFORE %left REC_SEX_TOK_SUB REC_SEX_TOK_ADD %left REC_SEX_TOK_MUL REC_SEX_TOK_DIV REC_SEX_TOK_MOD REC_SEX_TOK_MAT +%left REC_SEX_TOK_IN %left REC_SEX_TOK_AMP %left REC_SEX_TOK_NEG REC_SEX_TOK_MIN /* negation--unary minus */ %right REC_SEX_TOK_NOT @@ -152,6 +153,7 @@ exp : REC_SEX_TOK_INT { $$ = $1; } CREATE_NODE_OP2 (REC_SEX_OP_MAT, $$, $1, $3); } + | exp REC_SEX_TOK_IN exp { CREATE_NODE_OP2 (REC_SEX_OP_IN, $$, $1, $3); } | exp REC_SEX_TOK_ADD exp { CREATE_NODE_OP2 (REC_SEX_OP_ADD, $$, $1, $3); } | exp REC_SEX_TOK_SUB exp { CREATE_NODE_OP2 (REC_SEX_OP_SUB, $$, $1, $3); } | exp REC_SEX_TOK_MUL exp { CREATE_NODE_OP2 (REC_SEX_OP_MUL, $$, $1, $3); } diff --git a/src/rec-sex.c b/src/rec-sex.c index 40fcd61..16ba036 100644 --- a/src/rec-sex.c +++ b/src/rec-sex.c @@ -705,6 +705,43 @@ rec_sex_eval_node (rec_sex_t sex, return res; } + break; + } + case REC_SEX_OP_IN: + { + GET_CHILD_VAL (child_val1, 0); + GET_CHILD_VAL (child_val2, 1); + + res.type = REC_SEX_VAL_INT; + + if ((child_val1.type == REC_SEX_VAL_STR) + && (child_val2.type == REC_SEX_VAL_STR)) + { + char *token, *text, *ptr; + res.int_val = 0; + for (text = child_val2.str_val;; text = NULL) + { + token = strtok_r (text, " ", &ptr); + if (token == NULL) + break; + if (rec_sex_parser_case_insensitive (sex->parser)) + { + res.int_val = (strcasecmp (child_val1.str_val, token) == 0); + } + else + { + res.int_val = (strcmp (child_val1.str_val, token) == 0); + } + if (res.int_val) + break; + } + } + else + { + *status = false; + return res; + } + break; } case REC_SEX_OP_BEFORE: diff --git a/torture/utils/recsel.sh b/torture/utils/recsel.sh index d37de6b..7a5c103 100755 --- a/torture/utils/recsel.sh +++ b/torture/utils/recsel.sh @@ -1035,6 +1035,13 @@ test_tool recsel-sex-match ok \ Name: Tommy Junior ' +test_tool recsel-sex-op-in ok \ + recsel \ + '-p Name -e "'\''Tom'\'' in Name"' \ + academy \ +'Name: Tom Johnson +' + test_tool recsel-sex-date-sametime ok \ recsel \ '-e "Date == '\''Tue Nov 30 12:00:00 CET 2010'\''"' \ -- 2.25.0