perl_mlb
view release on metacpan or search on metacpan
charnames.pm view on Meta::CPAN
if ($^H & $bytes::hint_bits) { # "use bytes" in effect?
use bytes;
return chr $ord if $ord <= 255;
my $hex = sprintf "%04x", $ord;
if (not defined $fname) {
$fname = substr $txt, $off[0] + 2, $off[1] - $off[0] - 2;
}
croak "Character 0x$hex with name '$fname' is above 0xFF";
}
no warnings 'utf8'; # allow even illegal characters
return pack "U", $ord;
} # charnames
sub import
{
shift; ## ignore class name
if (not @_) {
carp("`use charnames' needs explicit imports list");
}
$^H |= $charnames::hint_bits;
$^H{charnames} = \&charnames ;
##
## fill %h keys with our @_ args.
##
my ($promote, %h, @args) = (0);
while (@_ and $_ = shift) {
if ($_ eq ":alias") {
@_ or
croak ":alias needs an argument in charnames";
my $alias = shift;
if (ref $alias) {
ref $alias eq "HASH" or
croak "Only HASH reference supported as argument to :alias";
alias ($alias);
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);
next;
}
if (m/^:/ and ! ($_ eq ":full" || $_ eq ":short")) {
warn "unsupported special '$_' in charnames";
next;
}
push @args, $_;
}
@args == 0 && $promote and @args = (":full");
@h{@args} = (1) x @args;
$^H{charnames_full} = delete $h{':full'};
$^H{charnames_short} = delete $h{':short'};
$^H{charnames_scripts} = [map uc, keys %h];
##
## If utf8? warnings are enabled, and some scripts were given,
## see if at least we can find one letter of each script.
##
if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
$txt = do "unicore/Name.pl" unless $txt;
for my $script (@{$^H{charnames_scripts}}) {
if (not $txt =~ m/\t\t$script (?:CAPITAL |SMALL )?LETTER /) {
warnings::warn('utf8', "No such script: '$script'");
}
}
}
} # import
require Unicode::UCD; # for Unicode::UCD::_getcode()
my %viacode;
sub viacode
{
if (@_ != 1) {
carp "charnames::viacode() expects one argument";
return ()
}
my $arg = shift;
my $code = Unicode::UCD::_getcode($arg);
my $hex;
if (defined $code) {
$hex = sprintf "%04X", $arg;
} else {
carp("unexpected arg \"$arg\" to charnames::viacode()");
return;
}
if ($code > 0x10FFFF) {
carp sprintf "Unicode characters only allocated up to U+10FFFF (you asked for U+%X)", $hex;
return;
}
return $viacode{$hex} if exists $viacode{$hex};
$txt = do "unicore/Name.pl" unless $txt;
if ($txt =~ m/^$hex\t\t(.+)/m) {
return $viacode{$hex} = $1;
} else {
return;
}
} # viacode
my %vianame;
sub vianame
{
if (@_ != 1) {
( run in 1.838 second using v1.01-cache-2.11-cpan-364913b4093 )