]> git.ozlabs.org Git - ccan-lca-2011.git/blob - ccan/cdump/test/run-02-parse.c
cdump: first cut of translation of Tridge's genstruct junkcode.
[ccan-lca-2011.git] / ccan / cdump / test / run-02-parse.c
1 #include <ccan/cdump/cdump_parse.c>
2 #include <ccan/tap/tap.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <unistd.h>
7
8 static size_t diffoff(const char *a, const char *b)
9 {
10         size_t i;
11
12         for (i = 0; a[i]; i++)
13                 if (b[i] != a[i])
14                         break;
15         return i;
16 }
17
18 static char *read_file(const void *ctx, const char *fname)
19 {
20         int fd = open(fname, O_RDONLY);
21         off_t len = lseek(fd, 0, SEEK_END);
22         char *ret = talloc_array(ctx, char, len + 1);
23         lseek(fd, 0, SEEK_SET);
24         read(fd, ret, len);
25         ret[len] = '\0';
26         close(fd);
27         return ret;
28 }
29
30 int main(int argc, char *argv[])
31 {
32         char *ret, *decls, *defs;
33         char *toplevel = talloc_strdup(NULL, "toplevel");
34         char *header, *definitions, *declarations;
35
36         plan_tests(5);
37         header = read_file(toplevel, "test/test_header.h");
38         declarations = read_file(toplevel, "test/example_generated-decls.h");
39         definitions = read_file(toplevel, "test/example_generated-defs.h");
40
41         ret = cdump_parse(toplevel, header, &decls, &defs);
42         ok1(ret == NULL);
43         ok(streq(decls, declarations),
44            "Declarations differ at %zu: ...'%.*s' vs ...'%.*s'",
45            diffoff(decls, declarations),
46            30, decls + diffoff(decls, declarations),
47            30, declarations + diffoff(decls, declarations));
48         ok(streq(defs, definitions),
49            "Definitions differ at %zu: ...'%.*s' vs ...'%.*s'",
50            diffoff(defs, definitions),
51            30, defs + diffoff(defs, definitions),
52            30, definitions + diffoff(defs, definitions));
53
54         ok1(talloc_find_parent_byname(decls, "toplevel") == toplevel);
55         ok1(talloc_find_parent_byname(defs, "toplevel") == toplevel);
56
57         talloc_free(toplevel);
58         return exit_status();
59 }