make Alias be a module as well.
authorPierre Habouzit <madcoder@debian.org>
Sun, 18 Mar 2007 21:53:59 +0000 (22:53 +0100)
committerPierre Habouzit <madcoder@debian.org>
Sun, 18 Mar 2007 21:53:59 +0000 (22:53 +0100)
update luapkg2c to deal with "static" modules.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Makefile.am
alias.cpkg [moved from alias.c with 96% similarity]
alias.h
init.h
lib-lua/lua-token.sh
lib-lua/luapkg2c.pl
lib-lua/runtime.c

index cc992ac..f09fc6c 100644 (file)
@@ -4,6 +4,8 @@
 AUTOMAKE_OPTIONS = foreign
 EXTRA_PROGRAMS = madmutt_dotlock pgpringng pgpewrapng makedoc
 
+.cpkg.c: ; ./lib-lua/luapkg2c.pl -c $< > $@
+
 if BUILD_NNTP
 NNTP_SUBDIR = nntp
 endif
@@ -17,7 +19,7 @@ DISTCLEANFILES = $(BUILT_SOURCES)
 
 bin_PROGRAMS = madmutt madmutt_dotlock pgpringng pgpewrapng smime_keysng
 madmutt_SOURCES = $(BUILT_SOURCES) \
-       alias.c attach.c base64.c browser.c buffy.c charset.c commands.c \
+       alias.cpkg 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 \
similarity index 96%
rename from alias.c
rename to alias.cpkg
index 03482c6..424adda 100644 (file)
--- a/alias.c
 #include "mutt_idna.h"
 #include "sort.h"
 
-char    *AliasFmt;
+@type bool = {
+    .kind = 'b';
+    .ctype = unsigned : 1;
+};
+
+@type string_t = {
+    .kind  = 's';
+    .ctype = char *;
+    .dtor  = p_delete($$);
+    .ctor  = m_strdup($$);
+};
+
+@type path_t = {
+    .push  = luaM_path_post($$);
+    .kind  = 's';
+    .ctype = char *;
+    .dtor  = p_delete($$);
+    .ctor  = m_strdup($$);
+};
+
+@type quadopt_t = {
+    .kind  = 'i';
+    .check = luaM_checkquadopt($L, $$);
+    .ctype = unsigned : 2;
+};
+
+static @package MAlias {
+    path_t alias_format = m_strdup("%4n %2f %t %-10a   %r");
+} MAlias;
+
 char    *AliasFile;
 alias_t *Aliases;
 rx_t     GecosMask;
@@ -516,7 +545,7 @@ alias_format_str(char *dest, ssize_t destlen, char op, const char *src,
 
 static void alias_entry(char *s, ssize_t slen, MUTTMENU *m, int num)
 {
-    m_strformat(s, slen, COLS - SW, AliasFmt, alias_format_str,
+    m_strformat(s, slen, COLS - SW, MAlias.alias_format, alias_format_str,
                 ((alias_t **)m->data)[num],
                 option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0);
 }
@@ -671,3 +700,5 @@ new_aliases:
   mutt_menuDestroy (&menu);
   p_delete(&AliasTable);
 }
+
+/* vim:set ft=c: */
diff --git a/alias.h b/alias.h
index 1819da7..74eab42 100644 (file)
--- a/alias.h
+++ b/alias.h
 #define _MUTT_ALIAS_H
 
 #include <lib-lib/lib-lib.h>
+#include <lib-lua/lib-lua.h>
+
 #include <lib-mime/mime.h>
 
+int luaopen_MAlias(lua_State *L);
+
 typedef struct alias_t {
     struct alias_t *next;
     char *name;
diff --git a/init.h b/init.h
index 1f706e6..abc629b 100644 (file)
--- a/init.h
+++ b/init.h
@@ -147,20 +147,6 @@ struct option_t MuttVars[] = {
    ** \fBNote:\fP Madmutt will not automatically source this file; you must
    ** explicitly use the ``$source'' command for it to be executed.
    */
-  {"alias_format", DT_STR, R_NONE, UL &AliasFmt, "%4n %2f %t %-10a   %r"},
-  /*
-   ** .pp
-   ** Specifies the format of the data displayed for the ``alias'' menu. The
-   ** following \fTprintf(3)\fP-style sequences are available:
-   ** .pp
-   ** .dl
-   ** .dt %a .dd alias name
-   ** .dt %f .dd flags - currently, a "d" for an alias marked for deletion
-   ** .dt %n .dd index number
-   ** .dt %r .dd address which alias expands to
-   ** .dt %t .dd character which indicates if the alias is tagged for inclusion
-   ** .de
-   */
   {"allow_8bit", DT_BOOL, R_NONE, OPTALLOW8BIT, "yes" },
   /*
    ** .pp
index e2f5ed3..a3ba223 100644 (file)
@@ -127,3 +127,4 @@ exit 0
 ## tmpdir
 ## username
 ## version
+## alias_format
index ac46db6..b7d1ba3 100755 (executable)
@@ -323,14 +323,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 <<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 = 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 <<EOF;
 
@@ -496,8 +556,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'");
index 21503a8..f570b55 100644 (file)
@@ -20,6 +20,8 @@
 #include <lib-lib/lib-lib.h>
 #include <lib-lua/lib-lua.h>
 
+#include <alias.h>
+
 static lua_State *L;
 
 void luaM_initialize(void)
@@ -35,6 +37,7 @@ void luaM_initialize(void)
         {LUA_DBLIBNAME,   luaopen_debug},
         {"MCore",         luaopen_MCore},
         {"MTransport",    luaopen_MTransport},
+        {"MAlias",        luaopen_MAlias},
     };
 
     int i;