# build parse functions for a parsed struct file function elem_name(v, elem) { return v["UNION"]elem; } function parse_array(f, v, elnum, flags, LOCAL, type, elem, array_len) { type = elements[elnum, "type"]; elem = elements[elnum, "elem"]; array_len = elements[elnum, "array_len"]; v["ELEM"] = elem_name(v, elem); v["TYPE"] = type; v["FLAGS"] = flags; v["ARRAY_LEN"] = array_len; if (array_len=="+") { print_template(f,"prs_array_optional.tpl", v); return; } if (array_len=="&") { print_template(f,"prs_array_null.tpl", v); return; } if (array_len=="*") { print_template(f,"prs_array_remainder.tpl", v); return; } if (type == "wchar" || type == "uint16") { if (match(array_len,"[0-9]") == 1) { print_template(f, "prs_wstring_fixed.tpl", v); } else { print_template(f, "prs_wstring.tpl", v); } } else if (type == "uint8") { if (match(array_len,"[0-9]") == 1) { print_template(f, "prs_uint8s_fixed.tpl", v); } else { print_template(f, "prs_uint8s.tpl", v); } } else { print_template(f, "prs_array.tpl", v); } } function parse_element(f, v, elnum, flags, LOCAL, type, elem) { if (elements[elnum,"nowire"] != "") { return; } type = elements[elnum, "type"]; if (substr(type,1,1) == ".") return; elem = elements[elnum, "elem"]; if (elements[elnum,"ptr"] == "") { v["PTR"] = "\\&"; } else { v["PTR"] = " "; } v["ELEM"] = elem_name(v, elem); v["TYPE"] = type; v["FLAGS"] = flags; print_template(f, "prs_element.tpl", v); } function parse_union(f, v, elnum, flags, LOCAL, i) { v["UNION"] = elements[elnum, "elem"]; v["SWITCH"] = elements[elnum, "switch"]; if (elements[elnum, "ptr"] == "1") { v["UNION"] = v["UNION"]"->"; } else { v["UNION"] = v["UNION"]"."; } print_template(f, "union_start.tpl", v); for (i=0;i