2011-08-02 11:31:57 +00:00
|
|
|
#!/usr/bin/perl
|
|
|
|
#
|
|
|
|
# vim:set ts=4 sw=4:
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
my $debug=0;
|
|
|
|
if($ARGV[0] eq "-d"){
|
|
|
|
$debug=1;
|
|
|
|
shift;
|
|
|
|
};
|
|
|
|
|
|
|
|
my $app=shift;
|
|
|
|
my @files=@ARGV;
|
|
|
|
my %menu;
|
|
|
|
my (@ticks,@inits);
|
|
|
|
|
|
|
|
$\="\n";
|
|
|
|
|
|
|
|
print "// Function definitions:";
|
|
|
|
my $menudef;
|
|
|
|
for my $file (@files){
|
|
|
|
open(F,"<",$file) || die "Can't open $file: $!";
|
|
|
|
while(<F>){
|
|
|
|
chomp;
|
|
|
|
s/\r$//; # Dos line-end
|
|
|
|
|
|
|
|
if(m!^\s*//#\s+(.*?)\s*$!){ # Menu definition
|
|
|
|
$menudef=$1;
|
|
|
|
next;
|
|
|
|
};
|
|
|
|
next if(/^\s*$/);
|
|
|
|
next if(m!^\s*//!);
|
|
|
|
if(m!^\s*void\s+([^(]+)\(!){ # A suitable function
|
|
|
|
my $func=$1;
|
|
|
|
if($func=~/tick_/){
|
|
|
|
push @ticks,$func;
|
|
|
|
print "void $func(void);";
|
|
|
|
};
|
|
|
|
if($func=~/init_/){
|
|
|
|
push @inits,$func;
|
|
|
|
print "void $func(void);";
|
|
|
|
};
|
|
|
|
if($debug){
|
|
|
|
my $f="debug";
|
|
|
|
$file =~ m!([^/.]+)\.! && do {$f=$1};
|
|
|
|
$menudef="MENU $f $func";
|
|
|
|
};
|
|
|
|
if(defined $menudef){
|
|
|
|
my @words=split(/\s+/,$menudef);
|
|
|
|
if($words[0] ne "MENU"){
|
|
|
|
warn "Not a menu definition?";
|
|
|
|
};
|
|
|
|
|
|
|
|
if($#words==1){
|
|
|
|
$menu{$words[1]}=$func;
|
|
|
|
}elsif($#words==2){
|
|
|
|
$menu{$words[1]}{$words[2]}=$func;
|
|
|
|
}else{
|
|
|
|
warn "Couldn't handle $menudef";
|
|
|
|
};
|
|
|
|
print "void $func(void);";
|
|
|
|
};
|
|
|
|
$menudef=undef;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
print "";
|
|
|
|
print "// Submenus:";
|
|
|
|
|
|
|
|
#use Data::Dumper; print Dumper \%menu;
|
|
|
|
|
|
|
|
for (sort keys %menu){
|
|
|
|
if(ref $menu{$_} eq "HASH"){
|
|
|
|
printf "static const struct MENU submenu_${_}={";
|
|
|
|
print qq! "$_", {!;
|
|
|
|
for my $entry(sort keys %{$menu{$_}}){
|
|
|
|
print qq!\t{ "$entry", &$menu{$_}{$entry}},!;
|
|
|
|
};
|
|
|
|
print qq!\t{NULL,NULL}!;
|
|
|
|
print "}};";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
print "";
|
|
|
|
|
|
|
|
for (sort keys %menu){
|
|
|
|
if(ref $menu{$_} eq "HASH"){
|
|
|
|
print qq!void run_submenu_$_(void) {!;
|
|
|
|
print qq!\thandleMenu(&submenu_$_);!;
|
|
|
|
print qq!};!;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
print "";
|
|
|
|
print "// Main menu:";
|
|
|
|
printf "static const struct MENU mainmenu={";
|
|
|
|
print qq! "Menu:", {!;
|
|
|
|
for (sort keys %menu){
|
|
|
|
if(ref $menu{$_} eq "HASH"){
|
|
|
|
print qq!\t{ "$_", &run_submenu_$_},!;
|
|
|
|
}else{
|
|
|
|
print qq!\t{ "$_", &$menu{$_}},!;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
print qq!\t\t{NULL,NULL}!;
|
|
|
|
print "}};";
|
|
|
|
|
|
|
|
print "";
|
|
|
|
print "// Tick & init functions:";
|
2011-08-03 16:28:24 +00:00
|
|
|
print qq!inline void tick_$app(void) {!;
|
2011-08-02 11:31:57 +00:00
|
|
|
for (sort @ticks){
|
|
|
|
print qq!\t$_();!;
|
|
|
|
};
|
|
|
|
print qq!};!;
|
|
|
|
|
2011-08-03 16:28:24 +00:00
|
|
|
print qq!inline void init_$app(void) {!;
|
2011-08-02 11:31:57 +00:00
|
|
|
for (sort @inits){
|
|
|
|
print qq!\t$_();!;
|
|
|
|
};
|
|
|
|
print qq!};!;
|
|
|
|
|