r395: BUG 1232: patch from landonf@opendarwin.org (Landon Fuller) to fix
[Samba/gebeck_regimport.git] / source / aparser / parserel.awk
blob6d80f0607e41584b0992fd1ecbfe473f79d4cb17
1 # build parse functions for a parsed struct file
3 function elem_name(v, elem)
5 return v["UNION"]elem;
8 function parse_array(f, v, elnum, flags,
9 LOCAL, type, elem, array_len)
11 type = elements[elnum, "type"];
12 elem = elements[elnum, "elem"];
13 array_len = elements[elnum, "array_len"];
14 v["ELEM"] = elem_name(v, elem);
15 v["TYPE"] = type;
16 v["FLAGS"] = flags;
17 v["ARRAY_LEN"] = array_len;
19 if (array_len=="+") {
20 print_template(f,"prs_array_optional.tpl", v);
21 return;
24 if (array_len=="&") {
25 print_template(f,"prs_array_null.tpl", v);
26 return;
29 if (array_len=="*") {
30 print_template(f,"prs_array_remainder.tpl", v);
31 return;
34 if (type == "wchar" || type == "uint16") {
35 if (match(array_len,"[0-9]") == 1) {
36 print_template(f, "prs_wstring_fixed.tpl", v);
37 } else {
38 print_template(f, "prs_wstring.tpl", v);
40 } else if (type == "uint8") {
41 if (match(array_len,"[0-9]") == 1) {
42 print_template(f, "prs_uint8s_fixed.tpl", v);
43 } else {
44 print_template(f, "prs_uint8s.tpl", v);
46 } else {
47 print_template(f, "prs_array.tpl", v);
52 function parse_element(f, v, elnum, flags,
53 LOCAL, type, elem)
55 if (elements[elnum,"nowire"] != "") {
56 return;
58 type = elements[elnum, "type"];
59 if (substr(type,1,1) == ".") return;
60 elem = elements[elnum, "elem"];
61 if (elements[elnum,"ptr"] == "") {
62 v["PTR"] = "\\&";
63 } else {
64 v["PTR"] = " ";
66 v["ELEM"] = elem_name(v, elem);
67 v["TYPE"] = type;
68 v["FLAGS"] = flags;
69 print_template(f, "prs_element.tpl", v);
72 function parse_union(f, v, elnum, flags,
73 LOCAL, i)
75 v["UNION"] = elements[elnum, "elem"];
76 v["SWITCH"] = elements[elnum, "switch"];
78 if (elements[elnum, "ptr"] == "1") {
79 v["UNION"] = v["UNION"]"->";
80 } else {
81 v["UNION"] = v["UNION"]".";
84 print_template(f, "union_start.tpl", v);
85 for (i=0;i<unions[elnum, "num_elems"];i++) {
86 v["CASE"] = elements[unions[elnum, i], "case"];
87 print_template(f, "prs_case.tpl", v);
88 if (elements[elnum, "ptr"] == "1") {
89 parse_scalars(f, v, unions[elnum, i], "PARSE_SCALARS");
90 parse_buffers(f, v, unions[elnum, i], "PARSE_BUFFERS");
91 } else {
92 if (flags == "PARSE_SCALARS") {
93 parse_scalars(f, v, unions[elnum, i], flags);
94 } else {
95 parse_buffers(f, v, unions[elnum, i], flags);
98 print_template(f, "prs_break.tpl", v);
100 v["UNION"] = "";
102 print_template(f, "union_end.tpl", v);
105 function parse_scalar(f, v, elnum, flags)
107 if (elements[elnum, "type"] == "union") {
108 parse_union(f, v, elnum, flags);
109 } else if (elements[elnum, "array_len"]!="") {
110 parse_array(f, v, elnum, flags);
111 } else {
112 parse_element(f, v, elnum, flags);
116 function parse_pointer(f, v, elnum, flags,
117 LOCAL, elem)
119 elem = elements[elnum, "elem"];
120 v["ELEM"] = elem_name(v, elem);
121 v["FLAGS"] = flags;
122 print_template(f, "prs_pointer.tpl", v);
125 function parse_scalars(f, v, elnum, flags)
127 if (elements[elnum, "ptr"] == "1") {
128 parse_pointer(f, v, elnum, flags);
129 } else {
130 parse_scalar(f, v, elnum, flags);
134 function parse_buffers(f, v, elnum, flags,
135 LOCAL, elem, type)
137 elem = elements[elnum, "elem"];
138 type = elements[elnum, "type"];
139 v["ELEM"] = elem_name(v, elem);
140 if (elements[elnum, "ptr"] == "1") {
141 print_template(f, "ifptr_start.tpl", v);
142 parse_scalar(f, v, elnum, "PARSE_SCALARS|PARSE_BUFFERS");
143 print_template(f, "ifptr_end.tpl", v);
144 } else {
145 parse_scalar(f, v, elnum, flags);
149 function struct_immediate(f, v, struct_num,
150 LOCAL, i, n1, num_elems)
152 num_elems = structs[struct_num, "num_elems"];
153 v["STRUCTNAME"] = structs[struct_num, "name"];
154 v["FUNCNAME"] = "io_" v["STRUCTNAME"];
156 print_template(f, "fn_i_start.tpl", v);
158 for (i=0;i<num_elems;i++) {
159 parse_scalars(f, v, structs[struct_num, i], "PARSE_SCALARS");
160 parse_buffers(f, v, structs[struct_num, i], "PARSE_BUFFERS");
163 print_template(f, "fn_i_end.tpl", v);
167 function struct_recursive(f, v, struct_num,
168 LOCAL, i, n1, num_elems)
170 num_elems = structs[struct_num, "num_elems"];
171 v["STRUCTNAME"] = structs[struct_num, "name"];
172 v["FUNCNAME"] = "io_" v["STRUCTNAME"];
174 print_template(f, "fn_start.tpl", v);
176 # first all the structure pointers, scalars and arrays
177 for (i=0;i<num_elems;i++) {
178 parse_scalars(f, v, structs[struct_num, i], "PARSE_SCALARS");
181 print_template(f, "fn_mid.tpl", v);
183 # now the buffers
184 for (i=0;i<num_elems;i++) {
185 parse_buffers(f, v, structs[struct_num, i], "PARSE_BUFFERS");
188 print_template(f, "fn_end.tpl", v);
191 function struct_parser(f, v, struct_num,
192 LOCAL, i, n1, num_elems)
194 if (structs[struct_num, "recurse"] == "True") {
195 struct_recursive(f, v, struct_num);
196 } else {
197 struct_immediate(f, v, struct_num);
201 function produce_relative(f,
202 LOCAL, v, i)
204 v["MODULE"]=module;
206 print_template(f, "module_start.tpl", v);
208 for (i=0;i < num_structs;i++) {
209 struct_parser(f, v, i);
212 print_template(f, "module_end.tpl", v);