diff options
Diffstat (limited to 'source3/aparser/dump.awk')
-rw-r--r-- | source3/aparser/dump.awk | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/source3/aparser/dump.awk b/source3/aparser/dump.awk new file mode 100644 index 0000000000..11bfb107e4 --- /dev/null +++ b/source3/aparser/dump.awk @@ -0,0 +1,70 @@ +# dump the current parse tree + + +function element_string(elnum, + LOCAL, elem) +{ + elem = elements[elnum, "elem"]; + if (elements[elnum, "ptr"]=="1") elem="*"elem; + if (elements[elnum, "array_len"]!="") + elem=elem"["elements[elnum, "array_len"]"]"; + if (elements[elnum, "switch"]!="") + elem=elem"["elements[elnum, "switch"]"]"; + return elem; +} + +function dump_element(f, elnum, + LOCAL, elem, type) +{ + type = elements[elnum, "type"]; + case = elements[elnum, "case"]; + elem = element_string(elnum); + if (case != "") { + xprintf(f,"\t\tcase %d %s %s;\n", case, type, elem); + } else { + xprintf(f,"\t%s %s;\n", type, elem); + } +} + +function dump_union(f, elnum, + LOCAL, i) +{ + xprintf(f,"\tunion %s {\n", element_string(elnum)); + for (i=0;i<unions[elnum, "num_elems"];i++) { + dump_element(f, unions[elnum, i]); + } + xprintf(f,"\t}\n"); +} + +function dump_elem(f, struct_num, elem_num, + LOCAL, enum) +{ + elnum = structs[struct_num, elem_num]; + + if (elements[elnum, "type"] == "union") { + dump_union(f, elnum); + } else { + dump_element(f, elnum); + } +} + +function dump_structs(f, NIL, + LOCAL, i, j) +{ + xprintf(f,"/* dump of parsed structures */\n\n\n"); + + for (i=0;i < num_options;i++) { + xprintf(f,"option %s %s\n", options[i, "name"], options[i, "value"]); + } + xprintf(f,"\n\n"); + + for (i=0;i < num_structs;i++) { + xprintf(f,"/* structure %d */\n", i); + xprintf(f,"struct %s {\n", structs[i, "name"]); + for (j=0;j<structs[i, "num_elems"];j++) { + dump_elem(f, i, j); + } + xprintf(f,"};\n\n"); + } + xprintf(f,"/* end dump */\n\n"); +} |