#!@PERL_PATH@ -w

# glib-mkenums.pl 
# Information about the current enumeration
my $flags;			# Is enumeration a bitmask?
my $option_lowercase_name;			# A lower case name to use as part of the *_get_type() function, instead of the one that we guess.
                        # For instance, when an enum uses abnormal capitalization and we can not guess where to put the underscores.
my $seenbitshift;		# Have we seen bitshift operators?
my $enum_prefix;		# Prefix for this enumeration
my $enumname;			# Name for this enumeration
my $enumshort;			# $enumname without prefix
my $enumindex = 0;		# Global enum counter
my $firstenum = 1;		# Is this the first enumeration per file?
my @entries;			# [ $name, $val ] for each entry

sub parse_trigraph {
    my $opts = shift;
    my @opts;

    for $opt (split /\s*,\s*/, $opts) {
	$opt =~ s/^\s*//;
	$opt =~ s/\s*$//;
        my ($key,$val) = $opt =~ /(\w+)(?:=(.+))?/;
	defined $val or $val = 1;
	push @opts, $key, $val;
    }
    @opts;
}
sub parse_entries {
    my $file = shift;
    my $file_name = shift;
    my $looking_for_name = 0;
    
    while (<$file>) {
	# read lines until we have no open comments
	while (m@/\*([^*]|\*(?!/))*$@) {
	    my $new;
	    defined ($new = <$file>) || die "Unmatched comment in $ARGV";
	    $_ .= $new;
	}
	# strip comments w/o options
	s@/\*(?!<)
	    ([^*]+|\*(?!/))*
	   \*/@@gx;
	
	# strip newlines
	s@\n@ @;
	
	# skip empty lines
	next if m@^\s*$@;
	
	if ($looking_for_name) {
	    if (/^\s*(\w+)/) {
		$enumname = $1;
		return 1;
	    }
	}
	
	# Handle include files
	if (/^\#include\s*<([^>]*)>/ ) {
            my $file= "../$1";
	    open NEWFILE, $file or die "Cannot open include file $file: $!\n";
	    
	    if (parse_entries (\*NEWFILE, $NEWFILE)) {
		return 1;
	    } else {
		next;
	    }
	}
	
	if (/^\s*\}\s*(\w+)/) {
	    $enumname = $1;
	    $enumindex++;
	    return 1;
	}
	
	if (/^\s*\}/) {
	    $enumindex++;
	    $looking_for_name = 1;
	    next;
	}

        if (m@^\s*
              (\w+)\s*                   # name
              (?:=(                      # value
		   \s*\w+\s*\(.*\)\s*       # macro with multiple args
		   |                        # OR
                   (?:[^,/]|/(?!\*))*       # anything but a comma or comment
                  ))?,?\s*
              (?:/\*<                    # options
                (([^*]|\*(?!/))*)
               >\s*\*/)?,?
              \s*$
             @x) {
            my ($name, $value, $options) = ($1,$2,$3);

	    if (!defined $flags && defined $value && $value =~ /<</) {
		$seenbitshift = 1;
	    }

	    if (defined $options) {
		my %options = parse_trigraph($options);
		if (!defined $options{skip}) {
		    push @entries, [ $name, $options{nick} ];
		}
	    } else {
		push @entries, [ $name ];
	    }
	} elsif (m@^\s*\#@) {
	    # ignore preprocessor directives
	} else {
	    print STDERR "$0: $file_name:$.: Failed to parse `$_'\n";
	}
    }

    return 0;
}

sub version {
    print STDERR "glib-mkenums version glib-@GLIB_VERSION@\n";
    print STDERR "glib-mkenums comes with ABSOLUTELY NO WARRANTY.\n";
    print STDERR "You may redistribute copies of glib-mkenums under the terms of\n";
    print STDERR "the GNU General Public License which can be found in the\n";
    print STDERR "GLib source package. Sources, examples and contact\n";
    print STDERR "information are available at http://www.gtk.org\n";
    exit 0;
}
sub usage {
    print STDERR "Usage: glib-mkenums [options] [files...]\n";
    print STDERR "  --fhead <text>             output file header\n";
    print STDERR "  --fprod <text>             per input file production\n";
    print STDERR "  --ftail <text>             output file trailer\n";
    print STDERR "  --eprod <text>             per enum text (produced prior to value itarations)\n";
    print STDERR "  --vhead <text>             value header, produced before iterating over enum values\n";
    print STDERR "  --vprod <text>             value text, produced for each enum value\n";
    print STDERR "  --vtail <text>             value tail, produced after iterating over enum values\n";
    print STDERR "  --comments <text>          comment structure\n";
    print STDERR "  --template file            template file\n";
    print STDERR "  -h, --help                 show this help message\n";
    print STDERR "  -v, --version              print version informations\n";
    print STDERR "Production text substitutions:\n";
    print STDERR "  \@EnumName\@                 PrefixTheXEnum\n";
    print STDERR "  \@enum_name\@                prefix_the_xenum\n";
    print STDERR "  \@ENUMNAME\@                 PREFIX_THE_XENUM\n";
    print STDERR "  \@ENUMSHORT\@                THE_XENUM\n";
    print STDERR "  \@VALUENAME\@                PREFIX_THE_XVALUE\n";
    print STDERR "  \@valuenick\@                the-xvalue\n";
    print STDERR "  \@type\@                     either enum or flags\n";
    print STDERR "  \@Type\@                     either Enum or Flags\n";
    print STDERR "  \@TYPE\@                     either ENUM or FLAGS\n";
    print STDERR "  \@filename\@                 name of current input file\n";
    exit 0;
}

# production variables:
my $fhead = "";   # output file header
my $fprod = "";   # per input file production
my $ftail = "";   # output file trailer
my $eprod = "";   # per enum text (produced prior to value itarations)
my $vhead = "";   # value header, produced before iterating over enum values
my $vprod = "";   # value text, produced for each enum value
my $vtail = "";   # value tail, produced after iterating over enum values
# other options
my $comment_tmpl = "/* \@comment\@ */";

sub read_template_file {
  my ($file) = @_;
  my %tmpl = ('file-header', $fhead, 
	      'file-production', $fprod, 
	      'file-tail', $ftail, 
	      'enumeration-production', $eprod,
	      'value-header', $vhead,
	      'value-production', $vprod,
	      'value-tail', $vtail,
	      'comment', $comment_tmpl);
  my $in = 'junk';
  open (FILE, $file) || die "Can't open $file: $!\n";
  while (<FILE>) {
    if (/^\/\*\*\*\s+(BEGIN|END)\s+([\w-]+)\s+\*\*\*\//) {
      if (($in eq 'junk') && ($1 eq 'BEGIN') && (exists($tmpl{$2}))) {
	$in = $2;
	next;
      }
      elsif (($in eq $2) && ($1 eq 'END') && (exists($tmpl{$2}))) {
	$in = 'junk';
	next;
      }
      else {
	  die "Malformed template file $file\n";
      }
    }
    if (!($in eq 'junk')) {
	$tmpl{$in} .= $_;
    }
  }
  close (FILE);
  if (!($in eq 'junk')) {
      die "Malformed template file $file\n";
  }
  $fhead = $tmpl{'file-header'};
  $fprod = $tmpl{'file-production'};
  $ftail = $tmpl{'file-tail'};
  $eprod = $tmpl{'enumeration-production'};
  $vhead = $tmpl{'value-header'};
  $vprod = $tmpl{'value-production'};
  $vtail = $tmpl{'value-tail'};
  $comment_tmpl = $tmpl{'comment'};
}

if (!defined $ARGV[0]) {
    usage;
}
while ($_ = $ARGV[0], /^-/) {
    shift;
    last if /^--$/;
    if (/^--template$/)              { read_template_file (shift); }
    elsif (/^--fhead$/)              { $fhead = $fhead . shift }
    elsif (/^--fprod$/)              { $fprod = $fprod . shift }
    elsif (/^--ftail$/)              { $ftail = $ftail . shift }
    elsif (/^--eprod$/)              { $eprod = $eprod . shift }
    elsif (/^--vhead$/)              { $vhead = $vhead . shift }
    elsif (/^--vprod$/)              { $vprod = $vprod . shift }
    elsif (/^--vtail$/)              { $vtail = $vtail . shift }
    elsif (/^--comments$/)           { $comment_tmpl = shift }
    elsif (/^--help$/ || /^-h$/)     { usage; }
    elsif (/^--version$/ || /^-v$/)  { version; }
    else { usage; }
}

# put auto-generation comment
{
    my $comment = $comment_tmpl;
    $comment =~ s/\@comment\@/Generated data (by glib-mkenums)/;
    print "\n" . $comment . "\n\n";
}

if (length($fhead)) {
    my $prod = $fhead;

    $prod =~ s/\@filename\@/$ARGV[0]/g;
    $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
    $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
    chomp ($prod);
		
    print "$prod\n";
}

while (<>) {
    if (eof) {
	close (ARGV);		# reset line numbering
	$firstenum = 1;		# Flag to print filename at next enum
    }

    # read lines until we have no open comments
    while (m@/\*([^*]|\*(?!/))*$@) {
	my $new;
	defined ($new = <>) || die "Unmatched comment in $ARGV";
	$_ .= $new;
    }
    # strip comments w/o options
    s@/\*(?!<)
       ([^*]+|\*(?!/))*
       \*/@@gx;
	
    if (m@^\s*typedef\s+enum\s*
           ({)?\s*
           (?:/\*<
             (([^*]|\*(?!/))*)
            >\s*\*/)?
         @x) {
	if (defined $2) {
	    my %options = parse_trigraph ($2);
	    next if defined $options{skip};
	    $enum_prefix = $options{prefix};
	    $flags = $options{flags};
      $option_lowercase_name = $options{lowercase_name};
	} else {
	    $enum_prefix = undef;
	    $flags = undef;
      $option_lowercase_name = 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, $ARGV);

	# figure out if this was a flags or enums enumeration
	if (!defined $flags) {
	    $flags = $seenbitshift;
	}

	# Autogenerate a prefix
	if (!defined $enum_prefix) {
	    for (@entries) {
		my $nick = $_->[1];
		if (!defined $nick) {
		    my $name = $_->[0];
		    if (defined $enum_prefix) {
			my $tmp = ~ ($name ^ $enum_prefix);
			($tmp) = $tmp =~ /(^\xff*)/;
			$enum_prefix = $enum_prefix & $tmp;
		    } else {
			$enum_prefix = $name;
		    }
		}
	    }
	    if (!defined $enum_prefix) {
		$enum_prefix = "";
	    } else {
		# Trim so that it ends in an underscore
		$enum_prefix =~ s/_[^_]*$/_/;
	    }
	} else {
	    # canonicalize user defined prefixes
	    $enum_prefix = uc($enum_prefix);
	    $enum_prefix =~ s/-/_/g;
	    $enum_prefix =~ s/(.*)([^_])$/$1$2_/;
	}
	
	for $entry (@entries) {
	    my ($name,$nick) = @{$entry};
            if (!defined $nick) {
 	        ($nick = $name) =~ s/^$enum_prefix//;
	        $nick =~ tr/_/-/;
	        $nick = lc($nick);
	        @{$entry} = ($name, $nick);
            }
	}
	

	# Spit out the output
	
	# enumname is e.g. GMatchType
	$enspace = $enumname;
	$enspace =~ s/^([A-Z][a-z]*).*$/$1/;
	
	$enumshort = $enumname;
	$enumshort =~ s/^[A-Z][a-z]*//;
	$enumshort =~ s/([^A-Z])([A-Z])/$1_$2/g;
	$enumshort =~ s/([A-Z][A-Z])([A-Z][0-9a-z])/$1_$2/g;
	$enumshort = uc($enumshort);

	$enumlong = uc($enspace) . "_" . $enumshort;
	$enumsym = lc($enspace) . "_" . lc($enumshort);

  #The options might override the lower case name if it could not be generated correctly:
  if (defined($option_lowercase_name)) {
      $enumsym = $option_lowercase_name;
  }

	if ($firstenum) {
	    $firstenum = 0;
	    
	    if (length($fprod)) {
		my $prod = $fprod;

		$prod =~ s/\@filename\@/$ARGV/g;
		$prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
		$prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
	        chomp ($prod);
		
		print "$prod\n";
	    }
	}
	
	if (length($eprod)) {
	    my $prod = $eprod;

	    $prod =~ s/\@enum_name\@/$enumsym/g;
	    $prod =~ s/\@EnumName\@/$enumname/g;
	    $prod =~ s/\@ENUMSHORT\@/$enumshort/g;
	    $prod =~ s/\@ENUMNAME\@/$enumlong/g;
	    if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; }
	    if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; }
	    if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; }
	    $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
	    $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
            chomp ($prod);

	    print "$prod\n";
	}

	if (length($vhead)) {
	    my $prod = $vhead;

	    $prod =~ s/\@enum_name\@/$enumsym/g;
            $prod =~ s/\@EnumName\@/$enumname/g;
            $prod =~ s/\@ENUMSHORT\@/$enumshort/g;
            $prod =~ s/\@ENUMNAME\@/$enumlong/g;
	    if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; }
	    if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; }
	    if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; }
            $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
            $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
            chomp ($prod);
	    
            print "$prod\n";
	}

	if (length($vprod)) {
	    my $prod = $vprod;
	    
	    $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
	    $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
	    for (@entries) {
		my ($name,$nick) = @{$_};
		my $tmp_prod = $prod;

		$tmp_prod =~ s/\@VALUENAME\@/$name/g;
		$tmp_prod =~ s/\@valuenick\@/$nick/g;
		if ($flags) { $tmp_prod =~ s/\@type\@/flags/g; } else { $tmp_prod =~ s/\@type\@/enum/g; }
		if ($flags) { $tmp_prod =~ s/\@Type\@/Flags/g; } else { $tmp_prod =~ s/\@Type\@/Enum/g; }
		if ($flags) { $tmp_prod =~ s/\@TYPE\@/FLAGS/g; } else { $tmp_prod =~ s/\@TYPE\@/ENUM/g; }
		chomp ($tmp_prod);

		print "$tmp_prod\n";
	    }
	}

	if (length($vtail)) {
	    my $prod = $vtail;

	    $prod =~ s/\@enum_name\@/$enumsym/g;
            $prod =~ s/\@EnumName\@/$enumname/g;
            $prod =~ s/\@ENUMSHORT\@/$enumshort/g;
            $prod =~ s/\@ENUMNAME\@/$enumlong/g;
	    if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; }
	    if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; }
	    if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; }
            $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
            $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
            chomp ($prod);
	    
            print "$prod\n";
	}
    }
}

if (length($ftail)) {
    my $prod = $ftail;

    $prod =~ s/\@filename\@/$ARGV/g;
    $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g;
    $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g;
    chomp ($prod);
		
    print "$prod\n";
}

# put auto-generation comment
{
    my $comment = $comment_tmpl;
    $comment =~ s/\@comment\@/Generated data ends here/;
    print "\n" . $comment . "\n\n";
}
