3 # Information about the current enumeration
5 my $flags; # Is enumeration a bitmask
6 my $seenbitshift; # Have we seen bitshift operators?
7 my $prefix; # Prefix for this enumeration
8 my $enumname; # Name for this enumeration
9 my $firstenum = 1; # Is this the first enumeration in file?
10 my @entries; # [ $name, $val ] for each entry
16 for $opt (split /\s*,\s*/, $opts) {
17 my ($key,$val) = $opt =~ /\s*(\w+)(?:=(\S+))?/;
18 defined $val or $val = 1;
19 push @opts, $key, $val;
27 # Read lines until we have no open comments
32 defined ($new = <$file>) || die "Unmatched comment";
44 # Handle include files
45 if (/^\#include\s*<([^>]*)>/ ) {
47 open NEWFILE, $file or die "Cannot open include file $file: $!\n";
49 if (parse_entries (\*NEWFILE)) {
56 if (/^\s*\}\s*(\w+)/) {
71 my ($name, $value, $options) = ($1,$2,$3);
73 if (!defined $flags && defined $value && $value =~ /<</) {
76 if (defined $options) {
77 my %options = parse_options($options);
78 if (!defined $options{skip}) {
79 push @entries, [ $name, $options{nick} ];
82 push @entries, [ $name ];
85 print STDERR "Can't understand: $_\n";
100 if ($ARGV[0] eq "arrays") {
103 } elsif ($ARGV[0] eq "defs") {
106 } elsif ($ARGV[0] eq "include") {
109 } elsif ($ARGV[0] eq "cfile") {
116 print ";; generated by makeenums.pl ; -*- scheme -*-\n\n";
118 print "/* Generated by makeenums.pl */\n\n";
122 print "#ifndef __GDK_ENUM_TYPES_H__\n";
123 print "#define __GDK_ENUM_TYPES_H__\n";
127 print "#include \"gdk.h\"\n";
133 close (ARGV); # reset line numbering
134 $firstenum = 1; # Flag to print filename at next enum
137 if (m@^\s*typedef\s+enum\s*
145 my %options = parse_options($2);
146 $prefix = $options{prefix};
147 $flags = $options{flags};
152 # Didn't have trailing '{' look on next lines
164 # Now parse the entries
165 parse_entries (\*ARGV);
167 # figure out if this was a flags or enums enumeration
169 if (!defined $flags) {
170 $flags = $seenbitshift;
173 # Autogenerate a prefix
175 if (!defined $prefix) {
178 if (defined $prefix) {
179 my $tmp = ~ ($name ^ $prefix);
180 ($tmp) = $tmp =~ /(^\xff*)/;
181 $prefix = $prefix & $tmp;
186 # Trim so that it ends in an underscore
187 $prefix =~ s/_[^_]*$/_/;
190 for $entry (@entries) {
191 my ($name,$nick) = @{$entry};
192 if (!defined $nick) {
193 ($nick = $name) =~ s/^$prefix//;
196 @{$entry} = ($name, $nick);
200 # Spit out the output
202 my $valuename = $enumname;
203 $valuename =~ s/([^A-Z])([A-Z])/$1_$2/g;
204 $valuename =~ s/([A-Z][A-Z])([A-Z][0-9a-z])/$1_$2/g;
205 $valuename = lc($valuename);
207 my $typemacro = $enumname;
208 $typemacro =~ s/([^A-Z])([A-Z])/$1_$2/g;
209 $typemacro =~ s/([A-Z][A-Z])([A-Z][0-9a-z])/$1_$2/g;
210 $typemacro = uc($valuename);
211 $typemacro =~ s/GDK_/GDK_TYPE_/g;
215 print qq(\n; enumerations from "$ARGV"\n);
219 print "\n(define-".($flags ? "flags" : "enum")." $enumname";
222 my ($name,$nick) = @{$_};
223 print "\n ($nick $name)";
227 } elsif ($gen_arrays) {
229 print "static const GtkEnumValue _${valuename}_values[] = {\n";
231 my ($name,$nick) = @{$_};
232 print qq( { $name, "$name", "$nick" },\n);
234 print " { 0, NULL, NULL }\n";
236 } elsif ($gen_includes) {
237 print "GType ${valuename}_get_type (void);\n";
238 print "#define ${typemacro} ${valuename}_get_type ()\n";
239 } elsif ($gen_cfile) {
242 ${valuename}_get_type (void)
244 static GType etype = 0;
249 print " static const GFlagsValue values[] = {\n";
251 print " static const GEnumValue values[] = {\n";
254 my ($name,$nick) = @{$_};
255 print qq( { $name, "$name", "$nick" },\n);
257 print " { 0, NULL, NULL }\n";
261 print " etype = g_flags_register_static (\"$enumname\", values);\n";
263 print " etype = g_enum_register_static (\"$enumname\", values);\n";
278 print "#endif /* __GDK_ENUMS_H__ */\n";