X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lua%2Fluapkg2c.pl;h=f1bab327825cb4a4961f773bd23251a65fe5df28;hp=9ab878991d469243b11aa5a32ba88587c71d767c;hb=05e61a9707a6da5c0bca77aa7c3c019a918494de;hpb=bb89a1ca75e867edbe281dc848720a95650c24ce diff --git a/lib-lua/luapkg2c.pl b/lib-lua/luapkg2c.pl index 9ab8789..f1bab32 100755 --- a/lib-lua/luapkg2c.pl +++ b/lib-lua/luapkg2c.pl @@ -83,7 +83,7 @@ sub parse_type($$) { while (stream_getline($src)) { last if (/^\s*\}\s*;\s*/); - if (/^\s*\.(push|kind|ctype|dtor|ctor|check)\s*=\s*(.*?)\s*;\s*$/) { + if (/^\s*\.(kind|ctype|dtor|ctor|push|check)\s*=\s*(.*?)\s*;\s*$/) { $t{$1} = $2; if ($1 eq "kind") { if ($2 =~ /^'([bis])'$/) { @@ -220,9 +220,7 @@ sub dump_fun($$) { } } - if (defined $t{type}->{push}) { - $call =~ s/\$\$/$t{type}->{push}/; - } + die "UNIMPLEMENTED" if defined $t{type}->{push}; if ($t{type}->{kind} eq 'b') { put_line($f, 0); @@ -293,6 +291,7 @@ EOF put_line($p, 0); if ($t{type}->{dtor}) { my $dtor = $t{type}->{dtor}; + $dtor =~ s/\$L/L/; $dtor =~ s/\$\$/\&$var/; print " $dtor;\n"; } @@ -322,14 +321,74 @@ extern struct luaM_$pkg->{name}_t $pkg->{cname}; EOF } +sub dump_struct_static($) { + my ($pkg) = @_; + + print "static struct {\n"; + foreach (@{$pkg->{props}}) { + my $p = $pkg->{members}{$_}; + my %t = find_type($p, $p->{type}); + if ($t{const}) { + printf " const $t{type}->{ctypefmt};\n", $p->{name}; + } else { + printf " $t{type}->{ctypefmt};\n", $p->{name}; + } + } + put_line($pkg, 0); + print "} $pkg->{cname} = {\n"; + + foreach (@{$pkg->{props}}) { + my $p = $pkg->{members}{$_}; + my %t = find_type($p, $p->{type}); + + if ($t{const}) { + put_line($p, 0); + print " $p->{init},\n"; + } else { + print " 0,\n" if ($t{type}->{kind} eq 'b'); + print " 0,\n" if ($t{type}->{kind} eq 'i'); + print " NULL,\n" if ($t{type}->{kind} eq 's'); + } + } + + print <{cname}_init(void) +{ +EOF + + foreach (@{$pkg->{props}}) { + my $p = $pkg->{members}{$_}; + my %t = find_type($p, $p->{type}); + my $var = $pkg->{cname}.".".$p->{name}; + + next if $t{const}; + + put_line($p, 0); + if ($t{type}->{dtor}) { + my $dtor = $t{type}->{dtor}; + $dtor =~ s/\$L/L/; + $dtor =~ s/\$\$/\&$var/; + print " $dtor;\n"; + } + print " $var = $p->{init};\n" + } + print "};\n"; +}; + #}}} #{{{ dump package -sub dump_package_full($) { - my $pkg = shift; +sub dump_package_full($$) { + my ($pkg, $static) = @_; - dump_struct_full($pkg); + if ($static) { + dump_struct_static($pkg); + } else { + dump_struct_full($pkg); + } map { print "\n"; dump_fun($pkg->{name}, $pkg->{members}{$_}); } @{$pkg->{meths}}; print <{props}}) { my $p = $pkg->{members}{$_}; my %t = find_type($p, $p->{type}); - my $call = $pkg->{cname}.".".$p->{name}; + my $call = $t{type}->{push} || '$$'; + + $call =~ s/\$L/L/; + $call =~ s/\$\$/$pkg->{cname}.$p->{name}/; my $tok = $p->{name}; $tok =~ tr/a-z/A-Z/; @@ -367,10 +429,6 @@ EOF $call = "lua_pushstring(L, $call)"; } - if (defined $t{type}->{push}) { - $call =~ s/\$\$/$t{type}->{push}/; - } - put_line($p, 0); print " case LTK_$tok:\n"; printf " $call;\n"; @@ -408,11 +466,13 @@ EOF print " case LTK_$tok: \n"; if ($t{type}->{dtor}) { my $dtor = $t{type}->{dtor}; + $dtor =~ s/\$L/L/; $dtor =~ s/\$\$/\&$var/; print " $dtor;\n"; } if ($t{type}->{ctor}) { my $ctor = $t{type}->{ctor}; + $ctor =~ s/\$L/L/; $ctor =~ s/\$\$/$check/; $check = $ctor; } @@ -493,8 +553,11 @@ sub do_c($) { if (/^\s*\@type\s+([a-zA-Z]\w*)\s*=\s*{\s*$/) { parse_type(\%src, $1); $resync = 1; + } elsif (/^\s*static\s+\@package\s+([a-zA-Z]\w*)\s+{\s*$/) { + dump_package_full(parse_package(\%src, $1), 1); + $resync = 1; } elsif (/^\s*\@package\s+([a-zA-Z]\w*)\s+{\s*$/) { - dump_package_full(parse_package(\%src, $1)); + dump_package_full(parse_package(\%src, $1), 0); $resync = 1; } elsif (/^\s*(\@\w*)/) { fatal(\%src, "syntax error: unknown directive `$1'");