section_generate.pl 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/perl -w
  2. use strict;
  3. die "no section perl file given" unless @ARGV;
  4. my $h = require($ARGV[0]);
  5. our $basename;
  6. our $debug = $ARGV[1];
  7. ($basename) = $ARGV[0] =~ /([a-zA-Z0-9_\-_]+).pl/;
  8. local *H;
  9. local *C;
  10. h_header();
  11. c_header();
  12. foreach (sort keys %{$h}) {
  13. foreach my $item (@{$h->{$_}}) {
  14. if ($_ eq "descriptors") {
  15. printf H ("#define %s_ID 0x%02X\n",uc($item->{name}),$item->{id});
  16. }
  17. do_it ($item->{name},$item->{elements});
  18. }
  19. }
  20. h_footer();
  21. c_footer();
  22. sub type
  23. {
  24. if ($_[0] > 16) {
  25. return "u32";
  26. } elsif ($_[0] > 8) {
  27. return "u16";
  28. } else {
  29. return "u8 ";
  30. }
  31. }
  32. sub do_it
  33. {
  34. my ($name,$val) = @_;
  35. print H "struct $name {\n";
  36. print C <<EOL;
  37. struct $name read_$name(const u8 *b)
  38. {
  39. struct $name v;
  40. EOL
  41. my $offs = 0;
  42. for (my $i = 0; $i < scalar @{$val}; $i+=2) {
  43. printf H ("\t\t%s %-25s :%2d;\n",type($val->[$i+1]),$val->[$i],$val->[$i+1]);
  44. printf C ("\tv.%-25s = getBits(b,%3d,%2d);\n",$val->[$i],$offs,$val->[$i+1]);
  45. printf C ("\tfprintf(stderr,\" %s = %%x %%d\\n\",v.%s,v.%s);\n",$val->[$i],$val->[$i],$val->[$i]) if $debug;
  46. $offs += $val->[$i+1];
  47. }
  48. print H "} PACKED;\n";
  49. print H "struct $name read_$name(const u8 *);\n\n";
  50. print C "\treturn v;\n}\n\n"
  51. }
  52. sub h_header
  53. {
  54. open(H,">$basename.h");
  55. print H "#ifndef __".uc($basename)."_H_\n";
  56. print H "#define __".uc($basename)."_H_\n\n";
  57. print H "#include \"section.h\"\n\n";
  58. }
  59. sub c_header
  60. {
  61. open(C,">$basename.c");
  62. print C "#include \"$basename.h\"\n\n";
  63. }
  64. sub c_footer
  65. {
  66. close(C);
  67. }
  68. sub h_footer
  69. {
  70. print H "#endif\n";
  71. close(H);
  72. }