1 # build parse functions for a parsed struct file
3 function elem_name
(v
, 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
);
17 v
["ARRAY_LEN"] = array_len
;
20 print_template
(f
,"prs_array_optional.tpl", v
);
25 print_template
(f
,"prs_array_null.tpl", v
);
30 print_template
(f
,"prs_array_remainder.tpl", v
);
34 if (type ==
"wchar" || type ==
"uint16") {
35 if (match(array_len
,"[0-9]") ==
1) {
36 print_template
(f
, "prs_wstring_fixed.tpl", v
);
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
);
44 print_template
(f
, "prs_uint8s.tpl", v
);
47 print_template
(f
, "prs_array.tpl", v
);
52 function parse_element
(f
, v
, elnum
, flags
,
55 if (elements
[elnum
,"nowire"] != "") {
58 type = elements
[elnum
, "type"];
59 if (substr(type
,1,1) ==
".") return;
60 elem = elements
[elnum
, "elem"];
61 if (elements
[elnum
,"ptr"] ==
"") {
66 v
["ELEM"] = elem_name
(v
, elem
);
69 print_template
(f
, "prs_element.tpl", v
);
72 function parse_union
(f
, v
, elnum
, flags
,
75 v
["UNION"] = elements
[elnum
, "elem"];
76 v
["SWITCH"] = elements
[elnum
, "switch"];
78 if (elements
[elnum
, "ptr"] ==
"1") {
79 v
["UNION"] = v
["UNION"]"->";
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");
92 if (flags ==
"PARSE_SCALARS") {
93 parse_scalars
(f
, v
, unions
[elnum
, i
], flags
);
95 parse_buffers
(f
, v
, unions
[elnum
, i
], flags
);
98 print_template
(f
, "prs_break.tpl", v
);
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
);
112 parse_element
(f
, v
, elnum
, flags
);
116 function parse_pointer
(f
, v
, elnum
, flags
,
119 elem = elements
[elnum
, "elem"];
120 v
["ELEM"] = elem_name
(v
, elem
);
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
);
130 parse_scalar
(f
, v
, elnum
, flags
);
134 function parse_buffers
(f
, v
, elnum
, flags
,
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
);
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
);
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
);
197 struct_immediate
(f
, v
, struct_num
);
201 function produce_relative
(f
,
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
);