X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fcharnames.pm;h=cd7b08aa97bfc0bd557bcdb99222e3d797900567;hb=ce4f4a1cb8714c6c6c3c7b002c9830a7cafc6780;hp=6037ea8af1ac563c176f0fffa9fdfff3608c79d4;hpb=35c0985d87e203a100f5c5fc6518bee6a2e2fd9d;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/charnames.pm b/lib/charnames.pm index 6037ea8..cd7b08a 100644 --- a/lib/charnames.pm +++ b/lib/charnames.pm @@ -2,10 +2,11 @@ package charnames; use strict; use warnings; use Carp; +use File::Spec; our $VERSION = '1.02'; use bytes (); # for $bytes::hint_bits -$charnames::hint_bits = 0x20000; +$charnames::hint_bits = 0x20000; # HINT_LOCALIZE_HH my %alias1 = ( # Icky 3.2 names with parentheses. @@ -52,9 +53,21 @@ sub alias (@) sub alias_file ($) { - my $arg = shift; - my $file = -f $arg ? $arg : "unicore/${arg}_alias.pl"; + my ($arg, $file) = @_; + if (-f $arg && File::Spec->file_name_is_absolute ($arg)) { + $file = $arg; + } + elsif ($arg =~ m/^\w+$/) { + $file = "unicore/${arg}_alias.pl"; + } + else { + croak "Charnames alias files can only have identifier characters"; + } if (my @alias = do $file) { + @alias == 1 && !defined $alias[0] and + croak "$file cannot be used as alias file for charnames"; + @alias % 2 and + croak "$file did not return a (valid) list of alias pairs"; alias (@alias); return (1); } @@ -94,7 +107,7 @@ sub charnames ## @off will hold the index into the code/name string of the start and ## end of the name as we find it. - ## If :full, look for the the name exactly + ## If :full, look for the name exactly if ($^H{charnames_full} and $txt =~ /\t\t\Q$name\E$/m) { @off = ($-[0], $+[0]); } @@ -178,18 +191,28 @@ sub import ## my ($promote, %h, @args) = (0); while (@_ and $_ = shift) { - if ($_ eq ":alias" && @_) { + if ($_ eq ":alias") { + @_ or + croak ":alias needs an argument in charnames"; my $alias = shift; if (ref $alias) { ref $alias eq "HASH" or - die "Only HASH reference supported as argument to :alias"; + croak "Only HASH reference supported as argument to :alias"; alias ($alias); next; } - if ($alias =~ m{:(\w+)$} and $1 ne "full" && $1 ne "short") { - alias_file ($1) and $promote = 1, next; + if ($alias =~ m{:(\w+)$}) { + $1 eq "full" || $1 eq "short" and + croak ":alias cannot use existing pragma :$1 (reversed order?)"; + alias_file ($1) and $promote = 1; + next; } - alias_file ($alias) and next; + alias_file ($alias); + next; + } + if (m/^:/ and ! ($_ eq ":full" || $_ eq ":short")) { + warn "unsupported special '$_' in charnames"; + next; } push @args, $_; }