diff options
Diffstat (limited to 'source3/aparser/parsetree.awk')
-rw-r--r-- | source3/aparser/parsetree.awk | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/source3/aparser/parsetree.awk b/source3/aparser/parsetree.awk new file mode 100644 index 0000000000..e0f946a663 --- /dev/null +++ b/source3/aparser/parsetree.awk @@ -0,0 +1,64 @@ +# build the parse tree for a struct file + +function start_module(name) +{ + module=name; + num_structs=0; +} + +function start_struct(name) +{ + current_struct=num_structs; + structs[name]=current_struct; + structs[current_struct, "name"]=name; + structs[current_struct, "num_elems"]=0; + structs[current_struct, "num_unions"]=0; +} + +function end_struct() +{ + num_structs++; + current_struct=""; +} + +function add_elem(type, elem, + LOCAL, elem_num) +{ + elem_num=structs[current_struct, "num_elems"]; + structs[current_struct, elem_num, "type"] = type; + structs[current_struct, elem_num, "elem"] = elem; + structs[current_struct, elem_num, "array_len"] = ""; + structs[current_struct, "num_elems"]++; + return elem_num; +} + +function add_array(array_len, type, elem, + LOCAL, elem_num) +{ + elem_num=add_elem(type, elem); + structs[current_struct, elem_num, "array_len"] = array_len; +} + +function start_union(switch, elem) +{ + current_union=elem; + add_elem("union", elem); + structs[current_struct, "unions", current_union, "switch"] = switch; + structs[current_struct, "unions", current_union, "num_elems"] = 0; +} + +function parse_case(value, type, elem, + LOCAL, elem_num) +{ + elem_num =structs[current_struct, "unions", current_union, "num_elems"]; + structs[current_struct, "unions", current_union, elem_num, "type"] = type; + structs[current_struct, "unions", current_union, elem_num, "elem"] = elem; + structs[current_struct, "unions", current_union, elem_num, "value"] = value; + structs[current_struct, "unions", current_union, "num_elems"]++; +} + +function end_union() +{ + current_union=""; +} + |