This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove unicode::distinct, as per Inaba Hiroto.
[perl5.git] / lib / charnames.pm
index 817b4c5..875c0a5 100644 (file)
@@ -1,6 +1,11 @@
 package charnames;
 
-my $fname = 'unicode/UnicodeData-Latest.txt';
+our $VERSION = '1.00';
+
+use bytes ();          # for $bytes::hint_bits
+use warnings();
+$charnames::hint_bits = 0x20000;
+
 my $txt;
 
 # This is not optimized in any way yet
@@ -28,10 +33,13 @@ sub charnames {
     }
   }
   die "Unknown charname '$name'" unless @off;
-  
-  my $ord = hex substr $txt, $off[0] - 4, 4;
-  if ($^H & 0x8) {     # "use byte" in effect?
-    use byte;
+
+  my $hexlen = 4; # Unicode guarantees 4-, 5-, or 6-digit format
+  $hexlen++ while
+      $hexlen < 6 && substr($txt, $off[0] - $hexlen - 1, 1) =~ /[0-9a-f]/;
+  my $ord = hex substr $txt, $off[0] - $hexlen, $hexlen;
+  if ($^H & $bytes::hint_bits) {       # "use bytes" in effect?
+    use bytes;
     return chr $ord if $ord <= 255;
     my $hex = sprintf '%X=0%o', $ord, $ord;
     my $fname = substr $txt, $off[0] + 2, $off[1] - $off[0] - 2;
@@ -42,14 +50,21 @@ sub charnames {
 
 sub import {
   shift;
-  die "No scripts for `use charnames'" unless @_;
-  $^H |= 0x20000;
+  die "`use charnames' needs explicit imports list" unless @_;
+  $^H |= $charnames::hint_bits;
   $^H{charnames} = \&charnames ;
   my %h;
   @h{@_} = (1) x @_;
   $^H{charnames_full} = delete $h{':full'};
   $^H{charnames_short} = delete $h{':short'};
   $^H{charnames_scripts} = [map uc, keys %h];
+  if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
+       $txt = do "unicode/Name.pl" unless $txt;
+    for (@{$^H{charnames_scripts}}) {
+        warnings::warn('utf8',  "No such script: '$_'") unless
+           $txt =~ m/\t\t$_ (?:CAPITAL |SMALL )?LETTER /;
+       }
+  }
 }
 
 
@@ -84,42 +99,45 @@ C<CHARNAME> is looked up as a letter in the given scripts (in the
 specified order).
 
 For lookup of C<CHARNAME> inside a given script C<SCRIPTNAME>
-F<charcodes.pm> looks for the names
+this pragma looks for the names
 
   SCRIPTNAME CAPITAL LETTER CHARNAME
   SCRIPTNAME SMALL LETTER CHARNAME
   SCRIPTNAME LETTER CHARNAME
 
 in the table of standard Unicode names.  If C<CHARNAME> is lowercase,
-then the C<CAPITAL> variant is ignored, otherwise C<SMALL> variant is
+then the C<CAPITAL> variant is ignored, otherwise the C<SMALL> variant is
 ignored.
 
 =head1 CUSTOM TRANSLATORS
 
-The mechanism of translation is C<\N{...}> escapes is general and not
+The mechanism of translation of C<\N{...}> escapes is general and not
 hardwired into F<charnames.pm>.  A module can install custom
-translations (inside the scope which C<use>s the module) by the
+translations (inside the scope which C<use>s the module) with the
 following magic incantation:
 
-  sub import {
-    shift;
-    $^H |= 0x20000;
-    $^H{charnames} = \&translator;
-  }
+    use charnames ();          # for $charnames::hint_bits
+    sub import {
+       shift;
+       $^H |= $charnames::hint_bits;
+       $^H{charnames} = \&translator;
+    }
 
 Here translator() is a subroutine which takes C<CHARNAME> as an
 argument, and returns text to insert into the string instead of the
 C<\N{CHARNAME}> escape.  Since the text to insert should be different
-in C<utf8> mode and out of it, the function should check the current
-state of C<utf8>-flag as in
-
-  sub translator {
-    if ($^H & 0x8) {
-      return utf_translator(@_);
-    } else {
-      return no_utf_translator(@_);
+in C<bytes> mode and out of it, the function should check the current
+state of C<bytes>-flag as in:
+
+    use bytes ();                      # for $bytes::hint_bits
+    sub translator {
+       if ($^H & $bytes::hint_bits) {
+           return bytes_translator(@_);
+       }
+       else {
+           return utf8_translator(@_);
+       }
     }
-  }
 
 =head1 BUGS
 
@@ -129,4 +147,3 @@ do any C<eval>s or C<require>s.  This restriction should be lifted in
 a future version of Perl.
 
 =cut
-