#!/usr/bin/perl # # Process enum.list and output ucd.h as well as # C code indicies for each enum. # sub close_frag($) { my($longname) = @_; print UCD_H "};\n\n"; print UCD_H "int unicode_property_names_\L${longname}\E(enum unicode_\L${longname}\E, const char **, const char **);\n\n"; print FRAG "};\n"; print FRAG <= sizeof enum_names/sizeof(struct libucd_enum_names) ) { ln = NULL; sn = NULL; rv = 1; } else { ln = enum_names[v].long_name; sn = enum_names[v].short_name; rv = 0; } if ( longname ) *longname = ln; if ( shortname ) *shortname = sn; return rv; } EOF close(FRAG); } open(LIST, '<', "enum.list") or die; open(UCD_IN, '<', "ucd.h.in") or die; open(UCD_H, '>', "ucd.h") or die; mkdir("enums", 0777); while ( defined($line = ) ) { last if ( $line =~ /ENUMS\;/ ); print UCD_H $line; } undef $shortname; while( defined($line = ) ) { chomp $line; next if ( $line =~ /^\s*(\#\#.*|)$/ ); if ( $line =~ /^\#\s*(\S+)\s+\((\S+)\)\s+(long|short)\s*$/ ) { $prev = $longname; $longname = $1; $shortname = $2; $whichname = ($3 eq 'long') ? 1 : 0; if ( defined($prev) ) { close_frag($prev); } print UCD_H "enum unicode_\L${longname}\E {\n"; open(FRAG, '>', "enums/${longname}.c") or die; print FRAG "#include \"libucd_int.h\"\n"; print FRAG "static const struct libucd_enum_names enum_names[] = {\n"; $seqpos = 0; } elsif ( $line =~ /\;/ ) { $line =~ s/\s*\#.*$//; # Remove comments @list = split(/\s*;\s*/, $line); if ( shift(@list) ne $shortname ) { die "$0: Unexpected line: $line\n"; } undef $epos; if ( $list[0] =~ /^[0-9]+$/ ) { $epos = shift(@list); } # Write ucd.h # $na is the preferred name, $nx the alternate ($na = $list[$whichname]) =~ tr/-/_/; ($nx = $list[1-$whichname]) =~ tr/-/_/; # If the Unicode Consortium defines a numeric value, # use that, otherwise use the sequential order in enum.list. # For that reason, enum.list should be maintained manually # and entries may only be added to the end of lists. $epos = defined($epos) ? $epos : $seqpos; $seqpos++; printf UCD_H " %s = %d,\n", "UC_\U${shortname}\E_${na}", $epos; if ($nx ne 'n/a' && $nx ne $na && $nx) { printf UCD_H " %s = %d,\n", "UC_\U${shortname}\E_${nx}", $epos; } # Write generator fragment ($ln = $list[1]) =~ tr/_/ /; $sn = $list[0]; $sn = ($sn eq 'n/a') ? '0' : "\"$sn\""; if ( defined($epos) ) { printf FRAG "\t[%3d] = { \"%s\", %s },\n", $epos, $ln, $sn; } else { printf FRAG "\t{ \"%s\", %s },\n", $ln, $sn; } } else { die "$0: Cannot parse: $line\n"; } } close_frag($longname); while ( defined($line = ) ) { print UCD_H $line; } close(UCD_IN); close(UCD_H);