]> Pileus Git - ~andy/gtk/commitdiff
Made the gtkmarshal.* generation rules maintainer-only.
authorOwen Taylor <otaylor@gtk.org>
Tue, 16 Jun 1998 00:13:04 +0000 (00:13 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Tue, 16 Jun 1998 00:13:04 +0000 (00:13 +0000)
Mon Jun 15 20:14:09 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/Makefile.am: Made the gtkmarshal.* generation
rules maintainer-only.

Really add makeenums.pl (this is getting to be a bad habit)

gtk/Makefile.am
gtk/makeenums.pl [new file with mode: 0755]

index 0de1799f500e6ed7466375417fe00c018841c06c..fa1f4caaf5d233382cfcf18c0392d4f580e8de59 100644 (file)
@@ -238,6 +238,9 @@ $(srcdir)/gtktypebuiltins_evals.c: @MAINT@ makeenums.pl $(srcdir)/gtk.defs
          perl $(srcdir)/makeenums.pl arrays $(srcdir)/gtk*.h \
                $(top_srcdir)/gdk/gdk*.h > $@
 
+gtkmarshal.c gtkmarshal.h: @MAINT@ gtkmarshal.list
+       srcdir=$(srcdir) perl $(srcdir)/genmarshal.pl
+
 # special remake rules
 #$(srcdir)/gtk.defs: @MAINT@ $(srcdir)/makeenums.awk
 #$(srcdir)/gtk.defs: @MAINT@ $(srcdir)/makeenums.h
@@ -328,6 +331,3 @@ test-debug: testgtk
        builddir=`pwd`; cd $(top_builddir); top_builddir=`pwd`; \
        cd $$builddir; cd $(srcdir); \
        $(SHELL) $$top_builddir/libtool --mode=execute gdb $$builddir/testgtk
-
-gtkmarshal.c gtkmarshal.h: gtkmarshal.list
-       srcdir=$(srcdir) perl $(srcdir)/genmarshal.pl
diff --git a/gtk/makeenums.pl b/gtk/makeenums.pl
new file mode 100755 (executable)
index 0000000..21bb8d4
--- /dev/null
@@ -0,0 +1,215 @@
+#!/usr/bin/perl -w
+
+# Information about the current enumeration
+
+my $flags;                     # Is enumeration a bitmask
+my $seenbitshift;                      # Have we seen bitshift operators?
+my $prefix;                    # Prefix for this enumeration
+my $enumname;                  # Name for this enumeration
+my $firstenum = 1;             # Is this the first enumeration in file?
+my @entries;                   # [ $name, $val ] for each entry
+
+sub parse_options {
+    my $opts = shift;
+    my @opts;
+
+    for $opt (split /\s*,\s*/, $opts) {
+       my ($key,$val) = $opt =~ /\s*(\w+)(?:=(\S+))?/;
+       defined $val or $val = 1;
+       push @opts, $key, $val;
+    }
+    @opts;
+}
+sub parse_entries {
+    my $file = shift;
+
+    while (<$file>) {
+       # Read lines until we have no open comments
+       while (m@/\*
+              ([^*]|\*(?!/))*$
+              @x) {
+           my $new;
+           defined ($new = <$file>) || die "Unmatched comment";
+           $_ .= $new;
+       }
+       # Now strip comments
+       s@/\*(?!<)
+           ([^*]+|\*(?!/))*
+          \*/@@gx;
+       
+       s@\n@ @;
+       
+       next if m@^\s*$@;
+
+       # Handle include files
+       if (/^\#include\s*<([^>]*)>/ ) {
+            my $file= "$ENV{'srcdir'}/../$1";
+           open NEWFILE, $file or die "Cannot open include file $file: $!\n";
+           
+           if (parse_entries (\*NEWFILE)) {
+               return 1;
+           } else {
+               next;
+           }
+       }
+       
+       if (/^\s*\}\s*(\w+)/) {
+           $enumname = $1;
+           return 1;
+       }
+
+       if (m@^\s*
+              (\w+)\s*                  # name
+              (?:=(                      # value
+                   (?:[^,/]|/(?!\*))*
+                  ))?,?\s*
+              (?:/\*<                   # options 
+                (([^*]|\*(?!/))*)
+               >\*/)?
+              \s*$
+             @x) {
+           my ($name, $value, $options) = ($1,$2,$3);
+
+           if (!defined $flags && defined $value && $value =~ /<</) {
+               $seenbitshift = 1;
+           }
+           if (!defined $options{skip}) {
+               if (defined $options) {
+                   my %options = parse_options($options);
+                   push @entries, [ $name, $options{nick} ];
+               } else {
+                   push @entries, [ $name ];
+               }
+           }
+       } else {
+           print STDERR "Can't understand: $_\n";
+       }
+    }
+    return 0;
+}
+
+
+my $gen_arrays = 0;
+my $gen_defs = 0;
+
+# Parse arguments
+
+if (@ARGV) {
+    if ($ARGV[0] eq "arrays") {
+       shift @ARGV;
+       $gen_arrays = 1;
+    } elsif ($ARGV[0] eq "defs") {
+       shift @ARGV;
+       $gen_defs = 1;
+    } else {
+       $gen_defs = 1;
+    }
+    
+}
+
+if ($gen_defs) {
+    print ";; generated by makeenums.awk  ; -*- scheme -*-\n\n";
+} else {
+    print "/* Generated by makeenums.pl */\n\n";
+}
+
+ENUMERATION:
+while (<>) {
+    if (eof) {
+       close (ARGV);           # reset line numbering
+       $firstenum = 1;         # Flag to print filename at next enum
+    }
+
+    if (m@^\s*typedef\s+enum\s*
+           ({)?\s*
+           (?:/\*<
+             (([^*]|\*(?!/))*)
+            >\*/)?
+         @x) {
+       if (defined $2) {
+           my %options = parse_options($2);
+           $prefix = $options{prefix};
+           $flags = $options{flags};
+       } else {
+           $prefix = undef;
+           $flags = undef;
+       }
+       # Didn't have trailing '{' look on next lines
+       if (!defined $1) {
+           while (<>) {
+               if (s/^\s*\{//) {
+                   last;
+               }
+           }
+       }
+
+       $seenbitshift = 0;
+       @entries = ();
+
+       # Now parse the entries
+       parse_entries (\*ARGV);
+
+       # figure out if this was a flags or enums enumeration
+
+       if (!defined $flags) {
+           $flags = $seenbitshift;
+       }
+
+       # Autogenerate a prefix
+
+       if (!defined $prefix) {
+           for (@entries) {
+               my $name = $_->[0];
+               if (defined $prefix) {
+                   my $tmp = ~ ($name ^ $prefix);
+                   ($tmp) = $tmp =~ /(^\xff*)/;
+                   $prefix = $prefix & $tmp;
+               } else {
+                   $prefix = $name;
+               }
+           }
+           # Trim so that it ends in an underscore
+           $prefix =~ s/_[^_]*$/_/;
+       }
+       
+       for $entry (@entries) {
+           my ($name,$nick) = @{$entry};
+            if (!defined $nick) {
+               ($nick = $name) =~ s/^$prefix//;
+               $nick =~ tr/_/-/;
+               $nick = lc($nick);
+               @{$entry} = ($name, $nick);
+            }
+       }
+
+       # Spit out the output
+
+       if ($gen_defs) {
+           if ($firstenum) {
+               print qq(\n; enumerations from "$ARGV"\n);
+               $firstenum = 0;
+           }
+           
+           print "\n(define-".($flags ? "flags" : "enum")." $enumname";
+
+           for (@entries) {
+               my ($name,$nick) = @{$_};
+               print "\n   ($nick $name)";
+           }
+           print ")\n";
+
+       } else {
+           ($valuename = $enumname) =~ s/([A-Z][a-z])/_$1/g;
+           $valuename =~ s/([a-z])([A-Z])/$1_$2/g;
+           $valuename = lc($valuename);
+
+           print "static GtkEnumValue $ {valuename}_values[] = {\n";
+           for (@entries) {
+               my ($name,$nick) = @{$_};
+               print qq(  { $name, "$name", "$nick" },\n);
+           }
+           print "  { 0, NULL, NULL }\n";
+           print "};\n";
+       }
+    }
+}