Code

data: Added sdb_data_parse_op().
authorSebastian Harl <sh@tokkee.org>
Wed, 8 Oct 2014 10:24:51 +0000 (12:24 +0200)
committerSebastian Harl <sh@tokkee.org>
Wed, 8 Oct 2014 10:24:51 +0000 (12:24 +0200)
This function parses the string representation of an operator.

src/core/data.c
src/include/core/data.h
t/unit/core/data_test.c

index 2a8c439e08c7da72dca03ce9b28e0c59413e36b2..4e52133484b8e219cdef562a86a7a9991bc2279e 100644 (file)
@@ -399,6 +399,24 @@ sdb_data_isnull(const sdb_data_t *datum)
        return 0;
 } /* sdb_data_isnull */
 
+int
+sdb_data_parse_op(const char *op)
+{
+       if (! strcmp(op, "+"))
+               return SDB_DATA_ADD;
+       else if (! strcmp(op, "-"))
+               return SDB_DATA_SUB;
+       else if (! strcmp(op, "*"))
+               return SDB_DATA_MUL;
+       else if (! strcmp(op, "/"))
+               return SDB_DATA_DIV;
+       else if (! strcmp(op, "%"))
+               return SDB_DATA_MOD;
+       else if (! strcmp(op, "||"))
+               return SDB_DATA_CONCAT;
+       return -1;
+} /* sdb_data_parse_op */
+
 int
 sdb_data_expr_eval(int op, const sdb_data_t *d1, const sdb_data_t *d2,
                sdb_data_t *res)
index 87607f810d344fc87d7bbc5943d16caaaa7fe9d7..f1c0324a1e6b7cd9d736255ec25917b3bfa2325f 100644 (file)
@@ -153,18 +153,24 @@ enum {
 };
 
 #define SDB_DATA_OP_TO_STRING(op) \
-       (((op) == SDB_DATA_ADD) \
-               ? "+" \
-               : ((op) == SDB_DATA_SUB) \
-                       ? "-" \
-                       : ((op) == SDB_DATA_MUL) \
-                               ? "*" \
-                               : ((op) == SDB_DATA_DIV) \
-                                       ? "/" \
-                                       : ((op) == SDB_DATA_MOD) \
-                                               ? "%" \
-                                               : ((op) == SDB_DATA_CONCAT) \
-                                                       ? "||" : "UNKNOWN")
+       (((op) == SDB_DATA_ADD) ? "+" \
+               : ((op) == SDB_DATA_SUB) ? "-" \
+               : ((op) == SDB_DATA_MUL) ? "*" \
+               : ((op) == SDB_DATA_DIV) ? "/" \
+               : ((op) == SDB_DATA_MOD) ? "%" \
+               : ((op) == SDB_DATA_CONCAT) ? "||" : "UNKNOWN")
+
+/*
+ * sdb_data_parse_op:
+ * Parse the string representation of an operator supported by
+ * sdb_data_expr_eval.
+ *
+ * Returns:
+ *  - the ID of the operator
+ *  - a negative value in case the operator does not exist
+ */
+int
+sdb_data_parse_op(const char *op);
 
 /*
  * sdb_data_expr_eval:
index 742466eec0008c599824de8c49bb37aacefc3d65..a1b4caa59965c7b307dcf848d40f0011ea4ea1b8 100644 (file)
@@ -617,6 +617,43 @@ START_TEST(test_strcmp)
 }
 END_TEST
 
+START_TEST(test_parse_op)
+{
+       struct {
+               const char *op;
+               int id;
+       } golden_data[] = {
+               { "+",  SDB_DATA_ADD },
+               { "-",  SDB_DATA_SUB },
+               { "*",  SDB_DATA_MUL },
+               { "/",  SDB_DATA_DIV },
+               { "%",  SDB_DATA_MOD },
+               { "||", SDB_DATA_CONCAT },
+               { "&&", -1 },
+       };
+
+       size_t i;
+
+       for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) {
+               const char *op;
+               int id;
+
+               id = sdb_data_parse_op(golden_data[i].op);
+               fail_unless(id == golden_data[i].id,
+                               "sdb_data_parse_op(%s) = %d; expected: %d",
+                               golden_data[i].op, id, golden_data[i].id);
+
+               if (id <= 0)
+                       continue;
+
+               op = SDB_DATA_OP_TO_STRING(id);
+               fail_unless(!strcmp(op, golden_data[i].op),
+                               "SDB_DATA_OP_TO_STRING(%d) = '%s'; expected: '%s'",
+                               id, op, golden_data[i].op);
+       }
+}
+END_TEST
+
 START_TEST(test_expr_eval)
 {
        struct {
@@ -1013,6 +1050,7 @@ core_data_suite(void)
        tcase_add_test(tc, test_data);
        tcase_add_test(tc, test_cmp);
        tcase_add_test(tc, test_strcmp);
+       tcase_add_test(tc, test_parse_op);
        tcase_add_test(tc, test_expr_eval);
        tcase_add_test(tc, test_format);
        tcase_add_test(tc, test_parse);