diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2014-02-17 00:05:40 +1100 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2014-03-03 10:51:50 +1100 |
commit | 827ac8eca016c39b13fc916bbdb16f9f2fe3c34c (patch) | |
tree | e7369759973f262d99a57641c1d503d7d15e379e /tests/string-expressions.c | |
parent | 9a8a1f41dd1ba0d8612f2177ec58e22eff312055 (diff) | |
download | device-tree-compiler-expressions.tar.gz |
Implement string concatenate and repeat operatorsexpressions
This patch exercises the new expression infrastructure to implement syntax
to concatenate and repeat strings. We use syntax inspired by Python,
with '+' overloaded for string concatenation and '*' overloaded for string
repeat. Normally we'd use C syntax to inspire dts syntax, but C has no
obvious candidates for these string operators.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'tests/string-expressions.c')
-rw-r--r-- | tests/string-expressions.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/tests/string-expressions.c b/tests/string-expressions.c new file mode 100644 index 0000000..da6854f --- /dev/null +++ b/tests/string-expressions.c @@ -0,0 +1,97 @@ +/* + * Testcase for dtc string expression support + * + * Copyright (C) 2013 David Gibson <david@gibson.dropbear.id.au> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdint.h> +#include <errno.h> + + +#include <libfdt.h> + +#include "tests.h" +#include "testdata.h" + +struct test_expr { + const char *expr; + const char *result; +} expr_table[] = { +#define TE(expr, res) { #expr, (res) } + TE("hello", "hello"), + TE("hello " + "world", "hello world"), + TE("hello" + " " + "world", "hello world"), + TE("hello" * 2 + " world", "hellohello world"), + TE("hello " + 2 * "world", "hello worldworld"), + TE(("hello"), "hello"), + TE(0 ? "hello" : "goodbye", "goodbye"), + TE(1 ? "hello" : "goodbye", "hello"), +}; + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +int main(int argc, char *argv[]) +{ + void *fdt; + const char *res; + int reslen; + int i; + + test_init(argc, argv); + + if ((argc == 3) && (strcmp(argv[1], "-g") == 0)) { + FILE *f = fopen(argv[2], "w"); + + if (!f) + FAIL("Couldn't open \"%s\" for output: %s\n", + argv[2], strerror(errno)); + + fprintf(f, "/dts-v1/;\n"); + fprintf(f, "/ {\n"); + for (i = 0; i < ARRAY_SIZE(expr_table); i++) + fprintf(f, "\texpression-%d = %s;\n", i, + expr_table[i].expr); + fprintf(f, "};\n"); + fclose(f); + } else { + fdt = load_blob_arg(argc, argv); + + for (i = 0; i < ARRAY_SIZE(expr_table); i++) { + char propname[16]; + int len = strlen(expr_table[i].result) + 1; + + sprintf(propname, "expression-%d", i); + res = fdt_getprop(fdt, 0, propname, &reslen); + + if (reslen != len) + FAIL("Incorrect length for expression %s," + " %d instead of %d\n", + expr_table[i].expr, reslen, len); + + if (memcmp(res, expr_table[i].result, len) != 0) + FAIL("Incorrect result for expression %s," + " \"%s\" instead of \"%s\"\n", + expr_table[i].expr, res, + expr_table[i].result); + } + } + + PASS(); +} |