update source to use our brand new source generator. Update automakes.
authorPierre Habouzit <madcoder@debian.org>
Mon, 26 Mar 2007 22:14:30 +0000 (00:14 +0200)
committerPierre Habouzit <madcoder@debian.org>
Mon, 26 Mar 2007 22:14:30 +0000 (00:14 +0200)
Yes the current state of affairs is completely hacky, using unbearable hacks
in tools/Makefile, I f***ing don't care, it works (for now).

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
20 files changed:
Makefile.am
alias.cpkg
imap/Makefile.am
lib-crypt/Makefile.am
lib-hash/Makefile.am
lib-lib/Makefile.am
lib-lua/Makefile.am
lib-lua/base.cpkg [new file with mode: 0644]
lib-lua/luapkg2c.pl [deleted file]
lib-lua/madmutt.cpkg
lib-mime/Makefile.am
lib-mx/Makefile.am
lib-sys/Makefile.am
lib-ui/Makefile.am
nntp/Makefile.am
pop/Makefile.am
tools/.gitignore [new file with mode: 0644]
tools/Makefile [new file with mode: 0644]
tools/cflags.mk [moved from cflags.mk with 100% similarity]
tools/cpkg2c.mk [new file with mode: 0644]

index bd8aab9..4330ce2 100644 (file)
@@ -4,15 +4,11 @@
 AUTOMAKE_OPTIONS = foreign
 EXTRA_PROGRAMS = madmutt_dotlock pgpringng pgpewrapng makedoc
 
-.cpkg.c:  ; ./lib-lua/luapkg2c.pl -c $< > $@
-.cpkg.li: ; ./lib-lua/luapkg2c.pl -h $< > $@
-
-
 if BUILD_NNTP
 NNTP_SUBDIR = nntp
 endif
 
-SUBDIRS = intl m4 po $(XXXXXXXXXXXX_doc) apidoc contrib \
+SUBDIRS = tools intl m4 po $(XXXXXXXXXXXX_doc) apidoc contrib \
          lib-lua lib-mime lib-lib lib-mx lib-crypt lib-hash lib-sys lib-ui \
          pop imap $(NNTP_SUBDIR)
 
@@ -21,7 +17,7 @@ DISTCLEANFILES = $(BUILT_SOURCES)
 
 bin_PROGRAMS = madmutt madmutt_dotlock pgpringng pgpewrapng smime_keysng
 madmutt_SOURCES = $(BUILT_SOURCES) \
-       alias.cpkg attach.c base64.c browser.c buffy.c charset.c commands.c \
+       alias.c attach.c base64.c browser.c buffy.c charset.c commands.c \
        compose.c copy.c editmsg.c init.c keymap.c lib.c \
        flags.c from.c handler.c headers.c help.c hook.c \
        main.c muttlib.c mutt_idna.c pager.c pattern.c postpone.c recvattach.c recvcmd.c \
@@ -41,8 +37,8 @@ madmutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ \
                $(top_builddir)/lib-lib/liblib.a \
                $(MUTTLIBS) $(INTLLIBS) $(LIBICONV)
 
-madmutt_DEPENDENCIES = $(top_builddir)/lib-lua/madmutt.li \
-                      $(top_builddir)/lib-lua/lua-token.h \
+madmutt_DEPENDENCIES = \
+                      \
                       @MUTT_LIB_OBJECTS@ @LIBOBJS@ \
                       $(top_builddir)/lib-lib/liblib.a \
                       $(top_builddir)/lib-mime/libmime.a \
@@ -152,7 +148,8 @@ stamp-doc-rc: $(srcdir)/init.h makedoc Madmuttrc.head
                $(srcdir)/init.h | ./makedoc -c | cat Madmuttrc.head - > Madmuttrc
        touch $@
 
--include cflags.mk
+include $(top_builddir)/tools/cpkg2c.mk
+-include $(top_buildir)/tools/cflags.mk
 
 wc:
        @sloccount $(wildcard *.h *.c) $(wildcard lib-*/) lib imap nntp pop | grep 'ansic[=:]'
index 6e33e29..b6b1dbe 100644 (file)
 #include "alias.h"
 #include "mutt_idna.h"
 #include "sort.h"
+@import  "lib-lua/base.cpkg"
 
-@type bool = {
-    .kind = 'b';
-    .ctype = unsigned : 1;
-};
-
-@type string_t = {
-    .kind  = 's';
-    .ctype = char *;
-    .dtor  = p_delete($$);
-    .ctor  = m_strdup($$);
-};
-
-@type path_t = {
-    .kind  = 's';
-    .ctype = char *;
-    .dtor  = p_delete($$);
-    .ctor  = luaM_pathnew($$);
-};
-
-@type quadopt_t = {
-    .kind  = 'i';
-    .check = luaM_checkquadopt($L, $$);
-    .ctype = unsigned : 2;
-};
-
-static @package MAlias {
+@static_package MAlias {
     string_t alias_format = m_strdup("%4n %2f %t %-10a   %r");
     path_t   alias_file   = m_strdup("~/.madmutt/aliases");
-} MAlias;
+};
 
 alias_t *Aliases;
 
index 8396aac..fb51379 100644 (file)
@@ -14,4 +14,4 @@ noinst_HEADERS = auth.h imap_private.h message.h
 libimap_a_SOURCES = auth.c auth_login.c browse.c command.c imap.c imap.h \
        message.c utf7.c util.c $(AUTHENTICATORS) auth_gss.c
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index 5dfc49b..2832f56 100644 (file)
@@ -14,4 +14,4 @@ libcrypt_a_SOURCES = pgp.h pgplib.h pgppacket.h smime.h crypt.h crypt-mod.h \
 noinst_HEADERS     =  pgp.h pgplib.h pgppacket.h smime.h crypt.h crypt-mod.h \
                      crypt-gpgme.h
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index 7a55dee..7231e4f 100644 (file)
@@ -5,3 +5,4 @@ libhash_a_SOURCES = md5.h sha1.h crypthash.h   \
 
 noinst_HEADERS    = md5.h sha1.h
 
+-include $(top_buildir)/tools/cflags.mk
index c4bacb2..3346eeb 100644 (file)
@@ -7,4 +7,4 @@ liblib_a_SOURCES = lib-lib.h mem.h \
 noinst_HEADERS   = lib-lib.h mem.h \
                   str.h utf8.h buffer.h hash.h array.h list.h file.h mapping.h date.h rx.h url.h
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index a12888b..64b8e6c 100644 (file)
@@ -1,13 +1,10 @@
 BUILT_SOURCES    = lua-token.h lua-token.c
 DISTCLEANFILES   = $(BUILT_SOURCES)
 
-.cpkg.c:  ; ./luapkg2c.pl -c $< > $@
-.cpkg.li: ; ./luapkg2c.pl -h $< > $@
-
 noinst_LIBRARIES = liblua.a
 
 liblua_a_DEPENDENCIES = madmutt.li
-liblua_a_SOURCES = madmutt.cpkg \
+liblua_a_SOURCES = madmutt.c \
                   lib-lua.h \
                   runtime.c \
                   $(BUILT_SOURCES)
@@ -21,4 +18,5 @@ DEFS=-DPKGDATADIR=\"$(pkgdatadir)\" -DSYSCONFDIR=\"$(sysconfdir)\" \
        -DBINDIR=\"$(bindir)\" -DMUTTLOCALEDIR=\"$(datadir)/locale\" \
        -DHAVE_CONFIG_H=1 -DPKGDOCDIR=\"$(docdir)\"
 
--include ../cflags.mk
+include $(top_builddir)/tools/cpkg2c.mk
+-include $(top_builddir)/tools/cflags.mk
diff --git a/lib-lua/base.cpkg b/lib-lua/base.cpkg
new file mode 100644 (file)
index 0000000..f9b7304
--- /dev/null
@@ -0,0 +1,33 @@
+@type bool {
+    .ctype = unsigned : 1;
+    .check = (luaL_checkinteger($L, $$) != 0);
+    .push  = lua_pushboolean($L, $$);
+};
+
+@type quadopt_t {
+    .ctype = unsigned : 2;
+    .check = luaM_checkquadopt($L, $$);
+    .push  = lua_pushinteger($L, $$);
+};
+
+@type string_t {
+    .ctype = char *;
+    .check = luaL_checkstring($L, $$);
+    .push  = lua_pushstring($L, $$);
+    .ctor  = m_strdup($$);
+    .dtor  = p_delete($$);
+};
+
+@type path_t : string_t {
+    .ctor  = luaM_pathnew($$);
+};
+
+@type rx_t {
+    .ctype = rx_t *;
+    .check = luaM_checkrx($L, $$);
+    .push  = lua_pushstring($L, $$ ? ($$)->pattern : NULL);
+    .ctor  = luaM_rxnew($$);
+    .dtor  = rx_delete($$);
+};
+
+/* vim:set ft=c: */
diff --git a/lib-lua/luapkg2c.pl b/lib-lua/luapkg2c.pl
deleted file mode 100755 (executable)
index f1bab32..0000000
+++ /dev/null
@@ -1,606 +0,0 @@
-#!/usr/bin/perl -w
-#  This program is free software; you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; either version 2 of the License, or (at
-#  your option) any later version.
-#
-#  This program is distributed in the hope that it will be useful, but
-#  WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-#  MA 02110-1301, USA.
-#
-#  Copyright © 2007 Pierre Habouzit
-
-use strict;
-
-my %types;
-my %pkgs;
-
-#{{{ stream functions
-
-sub stream_open($) {
-    my $name = shift;
-    open FILE, $name;
-    return (file => $name, line => 0, f => \*FILE);
-}
-
-sub stream_close($) {
-    my $stream = shift;
-    close $stream->{f};
-}
-
-sub stream_getline($) {
-    my $stream = shift;
-    my $file   = $stream->{f};
-    while (<$file>) {
-        ${$stream}{line}++;
-        return $_;
-    }
-    return;
-}
-
-#}}}
-
-#{{{ file:line functions
-
-sub fatal($$) {
-    my ($stream, $msg) = @_;
-    printf STDERR "%s:%d: %s\n", $stream->{file}, $stream->{line}, $msg;
-    exit 1;
-}
-
-sub get_pos($$) {
-    my ($h,$k) = @_;
-    return $h->{$k}{file}.':'.$h->{$k}{line};
-}
-
-sub put_line($$) {
-    my ($src,$inc) = @_;
-    printf "#line %d \"%s\"\n", $src->{line} + $inc, $src->{file};
-}
-
-#}}}
-
-#{{{ parsers
-
-sub parse_type($$) {
-    my ($src, $type) = @_;
-    my %t = (
-        name => $type,
-        file => $src->{file},
-        line => $src->{line},
-    );
-
-    if (defined $types{$type}) {
-        my $pos = get_pos(\%types, $type);
-        fatal($src, "already defined type: `$type' at $pos");
-    }
-
-    while (stream_getline($src)) {
-        last if (/^\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])'$/) {
-                    $t{kind} = $1;
-                } else {
-                    fatal($src, "error: .kind should be [ibs] got $2)");
-                }
-            }
-        } elsif (!/^\s*$/) {
-            fatal($src, "syntax error: unknown type directive");
-        }
-    }
-
-    for ('kind', 'ctype') {
-        fatal($src, "incomplete type $type: missing .$_") unless defined $t{$_};
-    }
-    if ($t{kind} eq 's') {
-        for ('dtor', 'ctor') {
-            fatal($src, "incomplete type $type: missing .$_") unless defined $t{$_};
-        }
-    }
-    unless (defined $t{check}) {
-        if ($t{kind} eq 'b') {
-            $t{check} = '(luaL_checkint($L, $$) == 0)';
-        }
-
-        if ($t{kind} eq 'i') {
-            $t{check} = 'luaL_checkint($L, $$)';
-        }
-
-        if ($t{kind} eq 's') {
-            $t{check} = 'luaL_checkstring($L, $$)';
-        }
-    }
-
-    $t{ctypefmt} .= ' %s' unless (($t{ctypefmt} = $t{ctype}) =~ s/:/ \%s :/);
-    $t{ctype} =~ s/:.*//;
-
-    return $types{$type} = \%t;
-}
-
-sub parse_package($$) {
-    my ($src, $pkg) = @_;
-    my %p = (
-        name => $pkg,
-        file => $src->{file},
-        line => $src->{line},
-    );
-
-    if (defined $pkgs{$pkg}) {
-        my $pos = get_pos(\%pkgs, $pkg);
-        fatal($src, "already defined package: `$pkg' at $pos");
-    }
-
-    while (stream_getline($src)) {
-        if (/^\s*\}\s*(\w+)\s*;\s*$/) {
-            $p{cname} = $1;
-            last;
-        }
-
-        if (/^\s*(.*?)\s*=\s*(.*?)\s*;\s*$/) {
-            my ($lhs, $rhs) = ($1, $2);
-            my %m = ( file => $src->{file}, line => $src->{line} );
-
-            if ($lhs =~ /^((?:const\s+)?\w+?)\s*(\w+)$/) {
-                $m{type} = $1;
-                $m{name} = $2;
-                $m{init} = $rhs;
-                push @{$p{props}}, $2;
-            } elsif ($lhs =~ /^((?:const\s+)?\w+?)\s*(\w*)\((.*)\)$/) {
-                $m{type}  = $1;
-                $m{name}  = $2;
-                $m{proto} = $3;
-                $m{cfun}  = $rhs;
-                push @{$p{meths}}, $2;
-            } else {
-                fatal($src, "syntax error");
-            }
-
-            if (defined $p{members}{$m{name}}) {
-                my $pos = get_pos($p{members}{$m{name}}, 0);
-                fatal($src, "already defined package member: `$m{name}' at $pos");
-            }
-
-            $p{members}{$m{name}} = \%m;
-            next;
-        }
-
-        if (!/^\s*$/) {
-            fatal($src, "syntax error");
-        }
-    }
-
-    return $pkgs{$pkg} = \%p;
-}
-
-sub find_type($$) {
-    my ($ref, $typ) = @_;
-
-    if ($typ =~ /^const\s+(\w*)$/) {
-        fatal($ref, "undefined type `$1'") unless defined $types{$1};
-        return (const => 1, type => $types{$1});
-    }
-
-    fatal($ref, "undefined type `$typ'") unless defined $types{$typ};
-    return (const => 0, type => $types{$typ});
-}
-
-#}}}
-
-#{{{ dump_fun
-
-sub dump_fun($$) {
-    my ($pkg, $f) = @_;
-    my %t    = find_type($f, $f->{type});
-    my $call = $f->{cfun};
-    $call =~ s/\$/var/;
-
-    print "static int luaM_${pkg}_$f->{name}(lua_State *L) {\n";
-
-    if ($f->{proto} ne "void") {
-        my $i = 1;
-        for my $tmp (split /,/,$f->{proto}) {
-            s/^\s+//;
-            s/\s+$//;
-
-            my %pt = find_type($f, $tmp);
-            my $check = $pt{type}->{check};
-            $check =~ s/\$L/L/;
-            $check =~ s/\$\$/\%d/;
-
-            put_line($pt{type}, 0);
-            printf "    $pt{type}->{ctype} var$i = $check\n", $i++;
-        }
-    }
-
-    die "UNIMPLEMENTED" if defined $t{type}->{push};
-
-    if ($t{type}->{kind} eq 'b') {
-        put_line($f, 0);
-        print "    lua_pushboolean(L, $call);\n";
-    }
-
-    if ($t{type}->{kind} eq 'i') {
-        put_line($f, 0);
-        print "    lua_pushint(L, $call);\n";
-    }
-
-    if ($t{type}->{kind} eq 's') {
-        if ($t{const}) {
-            put_line($f, 0);
-            print "    lua_pushstring(L, $call);\n";
-        } else {
-            print "    {\n";
-            put_line($f, 0);
-            print "        char *s = $call;\n";
-            print "        lua_pushstring(L, s);\n";
-            print "        p_delete(&s);\n";
-            print "    }\n";
-        }
-    }
-
-    printf "    return %d;\n", ($f->{type} ne "void");
-    print "}\n";
-}
-
-#}}}
-
-#{{{ dump_struct
-
-sub dump_struct_full($) {
-    my ($pkg) = @_;
-
-    put_line($pkg, 0);
-    print "struct luaM_$pkg->{name}_t $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 <<EOF;
-};
-
-static void $pkg->{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";
-};
-
-sub dump_struct_short($) {
-    my ($pkg) = @_;
-
-    print "struct luaM_$pkg->{name}_t {\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 <<EOF;
-};
-
-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 <<EOF;
-};
-
-static void $pkg->{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, $static) = @_;
-
-    if ($static) {
-        dump_struct_static($pkg);
-    } else {
-        dump_struct_full($pkg);
-    }
-    map { print "\n"; dump_fun($pkg->{name}, $pkg->{members}{$_}); } @{$pkg->{meths}};
-    print <<EOF;
-
-static const luaL_reg luaM_$pkg->{name}_methods[] = {
-EOF
-    map { print "    { \"$_\", luaM_$pkg->{name}_$_ },\n"; } @{$pkg->{meths}};
-    print <<EOF;
-    { NULL, NULL }
-};
-
-static int luaM_$pkg->{name}_index(lua_State *L)
-{
-    const char *idx = luaL_checkstring(L, 2);
-
-    switch (mlua_which_token(idx, -1)) {
-EOF
-
-    foreach (@{$pkg->{props}}) {
-        my $p = $pkg->{members}{$_};
-        my %t = find_type($p, $p->{type});
-        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/;
-
-        if ($t{type}->{kind} eq 'b') {
-            $call = "lua_pushboolean(L, $call)";
-        }
-
-        if ($t{type}->{kind} eq 'i') {
-            $call = "lua_pushinteger(L, $call)";
-        }
-
-        if ($t{type}->{kind} eq 's') {
-            $call = "lua_pushstring(L, $call)";
-        }
-
-        put_line($p, 0);
-        print  "      case LTK_$tok:\n";
-        printf "        $call;\n";
-        print  "        return 1;\n";
-    }
-
-print <<EOF;
-      default:
-        lua_rawget(L, lua_upvalueindex(2));       /* try methods       */
-        return 1;
-    }
-}
-
-static int luaM_$pkg->{name}_newindex(lua_State *L)
-{
-    const char *idx = luaL_checkstring(L, 2);
-
-    switch (mlua_which_token(idx, -1)) {
-EOF
-
-    foreach (@{$pkg->{props}}) {
-        my $p = $pkg->{members}{$_};
-        my %t = find_type($p, $p->{type});
-
-        next if ($t{const});
-
-        my $tok = $p->{name};
-        my $var = $pkg->{cname}.".".$p->{name};
-        my $check = $t{type}->{check};
-        $tok   =~ tr/a-z/A-Z/;
-        $check =~ s/\$L/L/;
-        $check =~ s/\$\$/3/;
-
-        put_line($p, 0);
-        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;
-        }
-        print "        $var = $check;\n";
-        print "        return 1;\n";
-    }
-
-print <<EOF;
-      default:
-        return 1;
-    }
-}
-
-int luaopen_$pkg->{name}(lua_State *L)
-{
-    int mt, methods;
-
-    $pkg->{cname}_init();
-
-    /* create methods table, add it the the table of globals */
-    luaL_openlib(L, "$pkg->{name}", luaM_$pkg->{name}_methods, 0);
-    methods = lua_gettop(L);
-
-    /* create metatable for $pkg->{name}, add it to the registry */
-    luaL_newmetatable(L, "$pkg->{name}");
-    mt = lua_gettop(L);
-
-    lua_pushliteral(L, "__index");
-    lua_pushvalue(L, mt);                       /* upvalue 1         */
-    lua_pushvalue(L, methods);                  /* upvalue 2         */
-    lua_pushcclosure(L, &luaM_$pkg->{name}_index, 2);
-    lua_rawset(L, mt);                          /* set mt.__index    */
-
-    lua_pushliteral(L, "__newindex");
-    lua_newtable(L);                            /* for new members   */
-    lua_pushcclosure(L, &luaM_$pkg->{name}_newindex, 1);
-    lua_rawset(L, mt);                          /* set mt.__newindex */
-
-    lua_pushliteral(L, "__metatable");
-    lua_pushvalue(L, methods);                  /* dup methods table */
-    lua_rawset(L, mt);                          /* hide metatable    */
-
-    lua_setmetatable(L, methods);
-
-    lua_pop(L, 1);                              /* drop mt           */
-    return 1;                                   /* return methods    */
-}
-
-EOF
-}
-
-sub dump_package_short($) {
-    my $pkg = shift;
-    my $upp = $pkg->{name};
-    $upp =~ tr/a-z/A-Z/;
-
-    print <<EOF;
-#ifndef MUTT_LUA_${upp}_H
-#define MUTT_LUA_${upp}_H
-
-EOF
-    dump_struct_short($pkg);
-    print <<EOF
-
-int luaopen_$pkg->{name}(lua_State *L);
-
-#endif /* MUTT_LUA_${upp}_H */
-EOF
-}
-
-#}}}
-
-sub do_c($) {
-    my %src = stream_open(shift);
-    my $resync = 1;
-
-    while (stream_getline(\%src)) {
-        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), 0);
-            $resync = 1;
-        } elsif (/^\s*(\@\w*)/) {
-            fatal(\%src, "syntax error: unknown directive `$1'");
-        } else {
-            next if ($resync && /^\s+$/);
-            if ($resync) {
-                put_line(\%src, 0);
-                $resync = 0;
-            }
-            print;
-        }
-    }
-
-    stream_close(\%src);
-}
-
-sub do_h($) {
-    my %src = stream_open(shift);
-    my $resync = 1;
-
-    while (stream_getline(\%src)) {
-        if (/^\s*\@type\s+([a-zA-Z]\w*)\s*=\s*{\s*$/) {
-            parse_type(\%src, $1);
-        } elsif (/^\s*\@package\s+([a-zA-Z]\w*)\s+{\s*$/) {
-            dump_package_short(parse_package(\%src, $1));
-        } elsif (/^\s*(\@\w*)/) {
-            fatal(\%src, "syntax error: unknown directive `$1'");
-        }
-    }
-
-    stream_close(\%src);
-}
-
-if ($#ARGV < 1 || ($ARGV[0] ne "-h" && $ARGV[0] ne "-c")) {
-    print <<EOF;
-usage: mluapkg (-h | -c) file.pkg
-EOF
-    exit 1;
-}
-
-print <<EOF;
-/*****     THIS FILE IS AUTOGENERATED DO NOT MODIFY DIRECTLY !    *****/
-EOF
-
-map { do_h($ARGV[$_]); } (1 .. $#ARGV) if ($ARGV[0] eq '-h');
-map { do_c($ARGV[$_]); } (1 .. $#ARGV) if ($ARGV[0] eq '-c');
index 610ee92..fd56f52 100644 (file)
@@ -24,6 +24,7 @@
 #include <pwd.h>
 
 #include "../mutt.h"
+@import "base.cpkg"
 
 static char *madmutt_init_shell(void)
 {
@@ -43,55 +44,14 @@ static char *madmutt_init_homedir(void)
     return m_strdup(pw ? pw->pw_dir : (getenv("HOME") ?: "/"));
 }
 
-static const char *madmutt_pwd(void)
-{
-    char path[_POSIX_PATH_MAX];
-    getcwd(path, sizeof(path));
-    return path;
-}
-
-@type bool = {
-    .kind = 'b';
-    .ctype = unsigned : 1;
-};
-
-@type string_t = {
-    .kind  = 's';
-    .ctype = char *;
-    .dtor  = p_delete($$);
-    .ctor  = m_strdup($$);
-};
-
-@type path_t = {
-    .kind  = 's';
-    .ctype = char *;
-    .dtor  = p_delete($$);
-    .ctor  = luaM_pathnew($$);
-};
-
-@type quadopt_t = {
-    .kind  = 'i';
-    .check = luaM_checkquadopt($L, $$);
-    .ctype = unsigned : 2;
-};
-
-@type rx_t = {
-    .kind  = 's';
-    .ctype = rx_t *;
-    .check = luaM_checkrx($L, $$);
-    .push  = ($$)->pattern;
-    .ctor  = luaM_rxnew($$);
-    .dtor  = rx_delete($$);
-};
-
 #if defined(HAVE_QDBM)
-#  define HCACHE_BACKEND "qdbm"
+#  define HCACHE_BACKEND  "qdbm"
 #elif defined(HAVE_GDBM)
-#  define HCACHE_BACKEND "gdbm"
+#  define HCACHE_BACKEND  "gdbm"
 #elif defined(HAVE_DB4)
-#  define HCACHE_BACKEND "db4"
+#  define HCACHE_BACKEND  "db4"
 #else
-#  define HCACHE_BACKEND "unknown"
+#  define HCACHE_BACKEND  NULL
 #endif
 
 @package MCore {
@@ -113,14 +73,21 @@ static const char *madmutt_pwd(void)
     bool      beep     = 1;
     bool      beep_new = 0;
 
-    const string_t pwd(void) = madmutt_pwd();
-} MCore;
+    const string_t pwd(void) {
+        char path[_POSIX_PATH_MAX];
+        getcwd(path, sizeof(path));
+        RETURN(path);
+    };
+};
 
 @package MTransport {
     path_t   sendmail = m_strdup(SENDMAIL " -eom -oi");
 
-    string_t dsn_notify = NULL /* TODO: check it's NULL, hdrs or full */;
-    string_t dsn_return = NULL /* TODO: check it's never, delay, failure, success with ',' */;
-} MTransport;
+    /* TODO: check it's NULL, hdrs or full */
+    string_t dsn_notify = NULL;
+
+    /* TODO: check it's never, delay, failure, success with ',' */
+    string_t dsn_return = NULL;
+};
 
 /* vim:set ft=c: */
index 779ef44..24c8e0f 100644 (file)
@@ -15,4 +15,4 @@ noinst_HEADERS    = mime.h mime-types.h
 mime-token.c mime-token.h: mime-token.def mime-token.sh
        sh mime-token.sh $@ < $<
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index 3261100..a9548c9 100644 (file)
@@ -5,4 +5,4 @@ libmx_a_SOURCES = mx.h mh.h mbox.h compress.h hcache.h \
 
 noinst_HEADERS  = mx.h
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index 20ce69f..102fb76 100644 (file)
@@ -9,4 +9,4 @@ libsys_a_SOURCES = exit.h unix.h mutt_signal.h \
 noinst_HEADERS   = exit.h unix.h \
                   mutt_socket.h mutt_tunnel.c mutt_ssl.h
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index 4461598..f372e2f 100644 (file)
@@ -7,4 +7,4 @@ libui_a_SOURCES = curses.h enter.h menu.h history.h sidebar.h \
 
 noinst_HEADERS  = curses.h enter.h menu.h history.h sidebar.h
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index ca6d65b..0907c36 100644 (file)
@@ -11,4 +11,4 @@ noinst_HEADERS = nntp.h
 
 libnntp_a_SOURCES = nntp.h nntp.c newsrc.c
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
index 1467447..6fca1fb 100644 (file)
@@ -11,4 +11,4 @@ noinst_HEADERS = pop.h
 
 libpop_a_SOURCES = pop.c pop_auth.c pop_lib.c pop.h
 
--include ../cflags.mk
+-include $(top_builddir)/tools/cflags.mk
diff --git a/tools/.gitignore b/tools/.gitignore
new file mode 100644 (file)
index 0000000..0977d93
--- /dev/null
@@ -0,0 +1 @@
+cpkg2c
diff --git a/tools/Makefile b/tools/Makefile
new file mode 100644 (file)
index 0000000..ec3e895
--- /dev/null
@@ -0,0 +1,14 @@
+# automake sucks, badly
+all: ../lib-mime/mime-token.h \
+    ../lib-lua/lua-token.h \
+    ../lib-lua/madmutt.li
+
+../%: ; $(MAKE) -C $(@D) $(@F)
+
+cpkg2c: cpkg2c.mll
+       ocamllex $<
+       $(if $(shell which ocamlopt),ocamlopt -o $@ str.cmxa,ocamlc -o $@ str.cma) $@.ml
+       @$(RM) cpkg2c.ml cpkg2c.c* cpkg2c.o
+
+clean:
+       $(RM) cpkg2c
similarity index 100%
rename from cflags.mk
rename to tools/cflags.mk
diff --git a/tools/cpkg2c.mk b/tools/cpkg2c.mk
new file mode 100644 (file)
index 0000000..66660fd
--- /dev/null
@@ -0,0 +1,9 @@
+%.c: %.cpkg $(top_builddir)/tools/cpkg2c
+       $(top_builddir)/tools/cpkg2c -c $< > $@ || (rm -f $@; exit 1)
+
+%.li: %.cpkg $(top_builddir)/tools/cpkg2c
+       $(top_builddir)/tools/cpkg2c -h $< > $@ || (rm -f $@; exit 1)
+
+$(top_builddir)/tools/cpkg2c:
+       $(MAKE) -C $(@D) $(@F)
+