1# dump the current parse tree 2 3 4function element_string(elnum, 5 LOCAL, elem) 6{ 7 elem = elements[elnum, "elem"]; 8 if (elements[elnum, "ptr"]=="1") elem="*"elem; 9 if (elements[elnum, "array_len"]!="") 10 elem=elem"["elements[elnum, "array_len"]"]"; 11 if (elements[elnum, "switch"]!="") 12 elem=elem"["elements[elnum, "switch"]"]"; 13 return elem; 14} 15 16function dump_element(f, elnum, 17 LOCAL, elem, type) 18{ 19 type = elements[elnum, "type"]; 20 case = elements[elnum, "case"]; 21 elem = element_string(elnum); 22 if (case != "") { 23 xprintf(f,"\t\tcase %d %s %s;\n", case, type, elem); 24 } else { 25 xprintf(f,"\t%s %s;\n", type, elem); 26 } 27} 28 29function dump_union(f, elnum, 30 LOCAL, i) 31{ 32 xprintf(f,"\tunion %s {\n", element_string(elnum)); 33 for (i=0;i<unions[elnum, "num_elems"];i++) { 34 dump_element(f, unions[elnum, i]); 35 } 36 xprintf(f,"\t}\n"); 37} 38 39function dump_elem(f, struct_num, elem_num, 40 LOCAL, enum) 41{ 42 elnum = structs[struct_num, elem_num]; 43 44 if (elements[elnum, "type"] == "union") { 45 dump_union(f, elnum); 46 } else { 47 dump_element(f, elnum); 48 } 49} 50 51function dump_structs(f, NIL, 52 LOCAL, i, j) 53{ 54 xprintf(f,"/* dump of parsed structures */\n\n\n"); 55 56 for (i=0;i < num_options;i++) { 57 xprintf(f,"option %s %s\n", options[i, "name"], options[i, "value"]); 58 } 59 xprintf(f,"\n\n"); 60 61 for (i=0;i < num_structs;i++) { 62 xprintf(f,"/* structure %d */\n", i); 63 xprintf(f,"struct %s {\n", structs[i, "name"]); 64 for (j=0;j<structs[i, "num_elems"];j++) { 65 dump_elem(f, i, j); 66 } 67 xprintf(f,"};\n\n"); 68 } 69 xprintf(f,"/* end dump */\n\n"); 70} 71