mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
c7829fa0d8
so the same parser generator can be uses for cifs and rpc
81 lines
1.7 KiB
Awk
81 lines
1.7 KiB
Awk
# produce a header file for a parsed struct file
|
|
|
|
function header_elstring(elnum,
|
|
LOCAL, elem)
|
|
{
|
|
array_len = elements[elnum, "array_len"];
|
|
elem=elements[elnum, "elem"];
|
|
if (elements[elnum, "ptr"]=="1") elem="*"elem;
|
|
if (array_len!="") {
|
|
if (is_constant(array_len) == 1) {
|
|
elem=elem"["array_len"]";
|
|
} else {
|
|
elem="*"elem;
|
|
}
|
|
}
|
|
return elem;
|
|
}
|
|
|
|
function header_element(f, elnum,
|
|
LOCAL, type)
|
|
{
|
|
type=elements[elnum, "type"];
|
|
if (substr(type,1,1) == ".") return;
|
|
xprintf(f,"\t%s %s;\n", type, header_elstring(elnum));
|
|
}
|
|
|
|
function header_union(f, elnum,
|
|
LOCAL, i)
|
|
{
|
|
xprintf(f,"\tunion {\n");
|
|
for (i=0;i<unions[elnum, "num_elems"];i++) {
|
|
header_element(f, unions[elnum, i]);
|
|
}
|
|
xprintf(f,"\t} %s;\n", header_elstring(elnum));
|
|
}
|
|
|
|
function header_elem(f, elnum)
|
|
{
|
|
|
|
if (elements[elnum, "type"] == "union") {
|
|
header_union(f, elnum);
|
|
} else {
|
|
header_element(f, elnum);
|
|
}
|
|
}
|
|
|
|
function header_struct(f, struct_num,
|
|
LOCAL, i)
|
|
{
|
|
xprintf(f,"/* structure %s */\n",
|
|
structs[struct_num, "name"]);
|
|
xprintf(f,"typedef struct {\n");
|
|
for (i=0;i < structs[struct_num, "num_elems"];i++) {
|
|
header_elem(f, structs[struct_num, i]);
|
|
}
|
|
xprintf(f,"} %s;\n\n\n", structs[struct_num, "name"]);
|
|
}
|
|
|
|
|
|
function produce_headers(f, NIL,
|
|
LOCAL, i)
|
|
{
|
|
xprintf(f,"/* auto-generated headers for %s */\n\n\n", module);
|
|
xprintf(f,"#ifndef _%s_\n", module);
|
|
xprintf(f,"#define _%s_\n", module);
|
|
|
|
xprintf(f,"\n\n");
|
|
for (i=0;i < num_options;i++) {
|
|
xprintf(f,"#define OPTION_%s %s\n",
|
|
options[i, "name"], options[i, "value"]);
|
|
}
|
|
xprintf(f,"\n\n");
|
|
|
|
for (i=0;i < num_structs;i++) {
|
|
header_struct(f, i);
|
|
}
|
|
xprintf(f,"/* end auto-generated headers */\n\n");
|
|
xprintf(f,"#endif /* _%s_ */\n", module);
|
|
}
|
|
|