gimp/tools/gcg/output_enum.c

56 lines
1.3 KiB
C

#include "output.h"
PNode* p_enum_member(Id id, PrimType* t){
return p_fmt("\t~,\n",
p_macro_name(t, NULL, id));
}
PNode* p_enum_decl(EnumDef* e){
PrimType* t=DEF(e)->type;
return p_fmt("typedef enum {\n"
"~"
"\t~ = ~\n"
"} ~;\n",
p_for(e->alternatives, p_enum_member, t),
p_macro_name(t, NULL, "last"),
p_macro_name(t, NULL,
g_slist_last(e->alternatives)->data),
p_primtype(t));
}
PNode* p_enum_value(Id i, PrimType* t){
return p_fmt("\t\t{~,\n"
"\t\t\"~\",\n"
"\t\t\"~\"},\n",
p_macro_name(t, NULL, i),
p_macro_name(t, NULL, i),
p_str(i));
}
void output_enum_type_init(PRoot* out, EnumDef* e){
PrimType* t=DEF(e)->type;
output_func(out,
"type",
NULL,
p_internal_varname(t, p_str("init_type")),
p_nil,
NULL,
p_fmt("\tstatic GtkEnumValue values[~] = {\n"
"~"
"\t\t{0, NULL, NULL}\n"
"\t};\n"
"\t~ = gtk_type_register_enum (\"~\", values);\n",
p_prf("%d", g_slist_length(e->alternatives)+1),
p_for(e->alternatives, p_enum_value, t),
p_internal_varname(t, p_str("type")),
p_primtype(t),
p_internal_varname(t, p_str("type"))));
}
void output_enum(PRoot* out, Def* d){
EnumDef* e = (EnumDef*)d;
output_enum_type_init(out, e);
pr_put(out, "type", p_enum_decl(e));
}