Add simple caches for ::viacode() and ::vianame().
Jarkko Hietaniemi [Sat, 1 Dec 2001 15:40:13 +0000 (15:40 +0000)]
p4raw-id: //depot/perl@13399

lib/charnames.pm
lib/charnames.t

index 5554ae0..ec200ec 100644 (file)
@@ -123,6 +123,8 @@ sub import
   }
 }
 
+my %viacode;
+
 sub viacode
 {
     if (@_ != 1) {
@@ -139,15 +141,19 @@ sub viacode
         return;
     }
 
+    return $viacode{$hex} if exists $viacode{$hex};
+
     $txt = do "unicore/Name.pl" unless $txt;
 
     if ($txt =~ m/^$hex\t\t(.+)/m) {
-        return $1;
+        return $viacode{$hex} = $1;
     } else {
         return;
     }
 }
 
+my %vianame;
+
 sub vianame
 {
     if (@_ != 1) {
@@ -157,10 +163,12 @@ sub vianame
 
     my $arg = shift;
 
+    return $vianame{$arg} if exists $vianame{$arg};
+
     $txt = do "unicore/Name.pl" unless $txt;
 
     if ($txt =~ m/^([0-9A-F]+)\t\t($arg)/m) {
-        return hex $1;
+        return $vianame{$arg} = hex $1;
     } else {
         return;
     }
@@ -213,7 +221,7 @@ is ignored.
 
 Note that C<\N{...}> is compile-time, it's a special form of string
 constant used inside double-quoted strings: in other words, you cannot
-used variables inside the C<\N{...}>.  If you want similar run-time
+use variables inside the C<\N{...}>.  If you want similar run-time
 functionality, use charnames::vianame().
 
 =head1 CUSTOM TRANSLATORS
index ce712c3..adc4b3f 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
 }
 
 $| = 1;
-print "1..20\n";
+print "1..22\n";
 
 use charnames ':full';
 
@@ -146,3 +146,15 @@ sub to_bytes {
        defined charnames::vianame("NONE SUCH");
     print "ok 20\n";
 }
+
+{
+    # check that caching at least hasn't broken anything
+
+    print "not " unless charnames::viacode(0x1234) eq "ETHIOPIC SYLLABLE SEE";
+    print "ok 21\n";
+
+    print "not " unless
+       sprintf "%04X\n", charnames::vianame("GOTHIC LETTER AHSA") eq "10330";
+    print "ok 22\n";
+
+}