2 use strict; use warnings;
4 use OpenILS::Utils::Fieldmapper;
8 print "usage: $0 <header_file> <source_file>\n";
12 warn "Generating fieldmapper-c code...\n";
14 #open(HEADER, ">fieldmapper.h");
15 #open(SOURCE, ">fieldmapper.c");
17 print $ARGV[0] . "\n";
18 print $ARGV[1] . "\n";
20 open(HEADER, ">$ARGV[0]");
21 open(SOURCE, ">$ARGV[1]");
23 my $map = $Fieldmapper::fieldmap;
27 #include "objson/object.h"
28 #include "objson/json_parser.h"
31 /* Fieldmapper-C. Autogenerated from fieldmapper-c.pl.\n\nNote that object*'s passed in as
32 constructor parameters are copied in so the originals will need to be freed*/
34 /* fm_obj is the generic placeholder object */
35 struct fm_obj_struct {
39 typedef struct fm_obj_struct fm_obj;
41 /* takes a json object and builds a fieldmapper object. the object
42 is then cast into an fm_obj and returned. To verify an object is
43 what is expected, check fm_obj_thing->classname. */
44 fm_obj* fm_factory(object*);
46 /* builds a new fieldmapper object by class name */
47 fm_obj* fm_factory_string(char*);
49 void fm_free(fm_obj* fm);
53 #include "fieldmapper.h"
55 void fm_free(fm_obj* fm) {
57 free_object(fm->array);
62 my $factory_string = <<C;
63 fm_obj* fm_factory(object* obj) {
66 if(!obj->classname) return NULL;
71 my $fstring_string = <<C;
72 fm_obj* fm_factory_string(char* string) {
73 if(!string) return NULL;
74 object* obj = new_object(NULL);
78 for my $object (keys %$map) {
80 my $short_name = $map->{$object}->{hint};
81 my $func_header_string = "";
82 my $func_code_string = "";
83 my $constructor_string = "";
85 $factory_string .= <<CODE;
86 if(!strcmp(obj->classname,"$short_name"))
87 fm = (fm_obj*) fm_new_$short_name(obj);
90 $fstring_string .= <<CODE;
91 if(!strcmp(string, "$short_name")) {
92 obj->set_class(obj, "$short_name");
95 my $header_string = <<CODE;
96 struct fm_${short_name}_struct {
99 char*\t\t(*to_string) (struct fm_${short_name}_struct*);
102 $func_header_string .= <<CODE;
103 char* fm_${short_name}_to_string(fm_$short_name*);
106 my $to_string = <<CODE;
107 char* fm_${short_name}_to_string(fm_$short_name* fm) {
108 if(!fm || !fm->array) return NULL;
109 growing_buffer* buf = buffer_init(256);
110 buffer_fadd(buf, "%s => {\\n", fm->classname);
114 $constructor_string .= <<CODE;
115 fm_$short_name* fm_new_$short_name(object* obj_array) {
117 fm_$short_name* fm = (fm_$short_name*) safe_malloc(sizeof(fm_$short_name));
119 /* build an empty array object */
121 fm->array = new_object(NULL);
122 fm->array->is_array = 1;
123 fm->array->set_class(fm->array, "$short_name");
127 /* we don't want invalid objects */
128 if (!obj_array->classname) return NULL;
129 if(strcmp(obj_array->classname, "$short_name")) return NULL;
131 char* s = obj_array->to_json(obj_array);
132 fm->array = json_parse_string(s);
136 fm->classname = fm->array->classname;
137 fm->to_string = &fm_${short_name}_to_string;
140 for my $field (keys %{$map->{$object}->{fields}}) {
141 my $position = $map->{$object}->{fields}->{$field}->{position};
143 $to_string .= <<CODE;
144 o = fm->array->get_index(fm->array, $position);
146 char* str = o->to_json(o);
147 buffer_fadd(buf, " $field\\t: %s\\n", str);
152 $fstring_string .= <<CODE;
153 tmp = new_object(NULL);
155 obj->set_index(obj, $position, tmp);
158 $header_string .= <<CODE;
159 object*\t(*get_$field) (struct fm_${short_name}_struct*);
160 void\t\t(*set_$field) (struct fm_${short_name}_struct*, object*);
163 $constructor_string .= <<CODE;
164 fm->set_$field = &fm_${short_name}_set_$field;
165 fm->get_$field = &fm_${short_name}_get_$field;
168 $func_header_string .= <<CODE;
169 object* fm_${short_name}_get_$field(fm_$short_name*);
170 void fm_${short_name}_set_$field(fm_$short_name*, object*);
173 $func_code_string .= <<CODE
174 object* fm_${short_name}_get_$field(fm_$short_name* fm) {
175 if(!fm || !fm->array) return NULL;
176 return fm->array->get_index(fm->array, $position);
179 void fm_${short_name}_set_$field(fm_$short_name* fm, object* obj) {
180 if(!fm || !fm->array || !obj) return;
181 fm->array->set_index(fm->array, $position, obj);
187 $fstring_string .= <<CODE;
188 return (fm_obj*) fm_new_$short_name(obj);
192 $to_string .= <<CODE;
193 buffer_add(buf,"}\\n");
194 char* b = buffer_data(buf);
200 $constructor_string .= "\treturn fm;\n}\n";
201 $header_string .= "};\n";
202 $func_code_string = $constructor_string . $to_string . $func_code_string;
204 $header_string .= "typedef struct fm_$short_name"."_struct fm_$short_name;\n\n";
205 $header_string .= "fm_$short_name* fm_new_$short_name(object*);\n";
206 $header_string .= "$func_header_string\n";
208 print HEADER "\n$header_string\n";
209 print SOURCE "\n$func_code_string\n";
214 $factory_string .= "\treturn fm;\n}\n";
215 #$fstring_string .= "\treturn NULL;\n}\n";
216 $fstring_string .= <<CODE;
222 print SOURCE "\n$factory_string\n";
223 print SOURCE "\n$fstring_string\n";