[Firebug-cvs] fireboard/beta/tools/src/xlisten genc.pm,1.1,1.2
Brought to you by:
doolin
From: David M. D. <do...@us...> - 2005-07-15 21:24:01
|
Update of /cvsroot/firebug/fireboard/beta/tools/src/xlisten In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7006 Modified Files: genc.pm Log Message: more mods to genc. Index: genc.pm =================================================================== RCS file: /cvsroot/firebug/fireboard/beta/tools/src/xlisten/genc.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** genc.pm 28 Jun 2005 20:04:32 -0000 1.1 --- genc.pm 15 Jul 2005 21:23:52 -0000 1.2 *************** *** 32,36 **** --- 32,40 ---- true; + + sub gen() { + + my %struct_hash; my ($classname, @spec) = @_; *************** *** 103,110 **** --- 107,129 ---- + + print $medskip; + + &gen_struct(); print $medskip; + + + print "//Format string generated automatically,\n"; + $tmp = @format[$#format-1]; + $tmp =~ s/,//g; + $fmtstr = "@format[0..($#format-1)] $tmp"; + #print "Fmt: $fmtstr\n"; + print "static char formatstring[] = \"@format[0..($#format-1)] $tmp\";\n\n\n"; + &gen_get_set(); print $medskip; + &gen_insert_stmt(); + print $medskip; ## Default behavior is to return the input as output. *************** *** 140,148 **** print $medskip; - print "//Format string can be generated automatically,\n"; - print "//then the delimiters added later: @format\n"; - - print $medskip; - ## In the code for the xlisten boards, the conversions are --- 159,162 ---- *************** *** 155,159 **** print " * necessary for processing.\n"; print " */\n"; ! print "$java_classname * convert(char * data) {\n"; print " // Just to keep gcc happy.\n"; print " return ($java_classname*)data;\n"; --- 169,173 ---- print " * necessary for processing.\n"; print " */\n"; ! print "$java_classname *\n $java_classname\_convert(char * data) {\n"; print " // Just to keep gcc happy.\n"; print " return ($java_classname*)data;\n"; *************** *** 164,183 **** ## Start printing output functions. ! print "/** Print the bytes of the packet. */\n"; ! print "void $java_classname\_print\_raw (XbowSensorboardPacket *packet) {\n\n"; ! print "$I$java_classname * userdata = ($java_classname*)packet->data;\n"; ! print "}\n\n"; ! ! ! print "/** Print typed output. */\n"; ! print "void $java_classname\_print\_cooked (XbowSensorboardPacket *packet) {\n\n"; ! print "$I$java_classname * userdata = ($java_classname*)packet->data;\n"; ! print "}\n\n"; ! - print "/** Print cooked with tabs. */\n"; - print "void $java_classname\_print\_tabbed (XbowSensorboardPacket *packet) {\n\n"; - print "$I$java_classname * userdata = ($java_classname*)packet->data;\n"; - print "}\n\n"; --- 178,185 ---- ## Start printing output functions. ! &gen_byte_output(); ! &gen_cooked_output(); ! &gen_cooked_with_tabs(); *************** *** 213,221 **** } sub gen_struct() { ! print "struct _$java_classname {\n"; - ## todo move this to sub print_msg_struct(). for (@fields) { ($field, $type, $bitlength, $offset, $amax, $abitsize, $aoffset) = @{$_}; --- 215,355 ---- } + sub gen_cooked_with_tabs() { + + print "/** Print cooked with tabs. */\n"; + print "void $java_classname\_print\_tabbed (XbowSensorboardPacket *packet) {\n\n"; + print "$I$java_classname * userdata = ($java_classname*)packet->data;\n"; + print "}\n\n"; + } + + + sub gen_byte_output() { + + print "/** Print the bytes of the packet. */\n"; + print "void $java_classname\_print\_raw (XbowSensorboardPacket *packet) {\n\n"; + print "$I$java_classname * userdata = ($java_classname*)packet->data;\n"; + print "}\n\n"; + } + + + sub gen_cooked_output() { + + print "/** Print cooked output. */\n"; + print "void\n$java_classname\_print\_cooked (void * userdata) {\n\n"; + print "$I$java_classname * data = ($java_classname*)userdata;\n"; + + + for (@fields) { + ($field, $type, $bitlength, $offset, $amax, $abitsize, $aoffset) = @{$_}; + ($ctype, $java_access, $arrayspec) = &cbasetype($type, $bitlength, 0); + if ($field =~ /(.*)\.([^.]*)$/) { + $struct = $1; + $member = $2; + #print STDERR $struct;#.", "$member."\n"; + } + ## Gets an array of format specifiers useful in *print* functions + ## in libc. the @format array can be passed + #push(@format, &formatstring($type, $bitlength, 0)); + $field =~ s/\./_/g; + print " printf(\"$field: ".&formatstring($type, $bitlength, 0)."\\n\",data->$field);\n"; + } + + + + print "}\n\n"; + + } + + + sub gen_insert_stmt() { + + $i = 0; + $numfields = $#fields; + + print "static char insert_stmt[] = \"INSERT into $java_classname (\"\n"; + + for (@fields) { + ($field, $type, $bitlength, $offset, $amax, $abitsize, $aoffset) = @{$_}; + ($ctype, $java_access, $arrayspec) = &cbasetype($type, $bitlength, 0); + + # This is clunky but will work. A better way to do it would be to store + # the nested struct internally in the field array somehow. + # Maybe a perl guru can figure that out. + # What needs to be done is to find one of these, then + # store it until all the members written out, + # then print it. + if ($field =~ /(.*)\.([^.]*)$/) { + $struct = $1; + $member = $2; + #print STDERR $struct;#.", "$member."\n"; + } + + ## Gets an array of format specifiers useful in *print* functions + ## in libc. the @format array can be passed + push(@format, &formatstring($type, $bitlength, 0)); + $field =~ s/\./_/g; + + if ($i < $numfields) { + printf "\"$field,\"\n"; + } else { + printf "\"$field) values ($fmtstr)\";\n\n"; + } + + $i++; + } + # print ");"; + + &gen_struct_array(); + + print "#if 0\n"; + + print "void\n$java_classname\_pg\_log(void * userdata) {\n"; + print "char pg_command[255];\n"; + print "$java_classname * data = ($java_classname*)userdata;\n"; + print "sprintf(pg_command,formatstring,\n"; + # traverse struct here. + while ( ($key, $value) = each(%struct_hash) ) { + # @cc{Do some processing on @scalar{$key} and @scalar{$value}} + print "data->$key,\n" + } + print "}\n"; + print "#endif\n"; + } + + sub gen_struct() { ! print "struct _$java_classname {\n"; ! ! ## todo move this to sub print_msg_struct(). ! for (@fields) { ! ($field, $type, $bitlength, $offset, $amax, $abitsize, $aoffset) = @{$_}; ! ! ($ctype, $java_access, $arrayspec) = &cbasetype($type, $bitlength, 0); ! ! # This is clunky but will work. A better way to do it would be to store ! # the nested struct internally in the field array somehow. ! # Maybe a perl guru can figure that out. ! # What needs to be done is to find one of these, then ! # store it until all the members written out, ! # then print it. ! if ($field =~ /(.*)\.([^.]*)$/) { ! $struct = $1; ! $member = $2; ! #print STDERR $struct;#.", "$member."\n"; ! } ! ! ## Gets an array of format specifiers useful in *print* functions ! ## in libc. the @format array can be passed ! push(@format, &formatstring($type, $bitlength, 0)); ! $field =~ s/\./_/g; ! printf "$I$ctype $field;\n"; ! } ! print "};"; ! } ! ! ! sub gen_struct_array() { for (@fields) { ($field, $type, $bitlength, $offset, $amax, $abitsize, $aoffset) = @{$_}; *************** *** 239,247 **** push(@format, &formatstring($type, $bitlength, 0)); $field =~ s/\./_/g; ! printf "$I$ctype $field;\n"; } ! print "};"; } sub gen_get_set() { --- 373,382 ---- push(@format, &formatstring($type, $bitlength, 0)); $field =~ s/\./_/g; ! $struct_hash{$field} = $ctype; } ! } + sub gen_get_set() { *************** *** 272,277 **** ## the same as in nesc. Probably need to add a "bitfield" handler to ## do it right. ! sub cbasetype() ! { my ($basetype, $bitlength, $arraydims) = @_; my $jtype, $acc; --- 407,412 ---- ## the same as in nesc. Probably need to add a "bitfield" handler to ## do it right. ! sub cbasetype() { ! my ($basetype, $bitlength, $arraydims) = @_; my $jtype, $acc; *************** *** 320,333 **** if ($basetype eq "U") { $acc = "UIntElement"; ! if ($bitlength < 8) { $jtype = "byte"; $formatstring = "c";} ! elsif ($bitlength < 16) { $jtype = "short"; $formatstring = "i";} ! elsif ($bitlength < 32) { $jtype = "int"; $formatstring = "i";} ! else { $jtype = "long"; $formatstring = "%i"} } elsif ($basetype eq "I") { $acc = "SIntElement"; ! if ($bitlength <= 8) { $jtype = "byte"; $formatstring = "c";} ! elsif ($bitlength <= 16) { $jtype = "short"; $formatstring = "i";} ! elsif ($bitlength <= 32) { $jtype = "int"; $formatstring = "i";} else { $jtype = "long"; } } --- 455,468 ---- if ($basetype eq "U") { $acc = "UIntElement"; ! if ($bitlength < 8) { $jtype = "byte"; $formatstring = "%c,";} ! elsif ($bitlength < 16) { $jtype = "short"; $formatstring = "%i,";} ! elsif ($bitlength < 32) { $jtype = "int"; $formatstring = "%i,";} ! else { $jtype = "long"; $formatstring = "%i,"} } elsif ($basetype eq "I") { $acc = "SIntElement"; ! if ($bitlength <= 8) { $jtype = "byte"; $formatstring = "%c,";} ! elsif ($bitlength <= 16) { $jtype = "short"; $formatstring = "%i,";} ! elsif ($bitlength <= 32) { $jtype = "int"; $formatstring = "%i,";} else { $jtype = "long"; } } |