Make Perl_keyword() another 30% faster.
Marcus Holland-Moritz [Mon, 31 Jan 2005 19:22:41 +0000 (19:22 +0000)]
p4raw-id: //depot/perl@23914

perl_keyword.pl
toke.c

index 957f8f9..b06527c 100644 (file)
@@ -1,58 +1,9 @@
-#!./perl -w
 
 # How to generate the logic of the lookup table Perl_keyword() in toke.c
 
+use Devel::Tokenizer::C 0.04;
 use strict;
-package Toke;
-use vars qw(@ISA %types);
-require ExtUtils::Constant::Base;
-@ISA = 'ExtUtils::Constant::Base';
-
-%types = (pos => "KEY_", neg => "-KEY_");
-
-# We're allowing scalar references to produce evil customisation.
-sub valid_type {
-  defined $types{$_[1]} or ref $_[1];
-}
-
-
-# This might actually be a return statement
-sub assignment_clause_for_type {
-  my ($self, $args, $value) = @_;
-  my ($type, $item) = @{$args}{qw(type item)};
-  my $comment = '';
-  $comment = " /* Weight $item->{weight} */" if defined $item->{weight};
-  return "return $types{$type}$value;$comment" if $types{$type};
-  "$$type$value;$comment";
-}
-
-sub return_statement_for_notfound {
-  "return 0;"
-}
-
-# Ditch the default "const"
-sub name_param_definition {
-  "char *" . $_[0]->name_param;
-}
-
-sub C_constant_return_type {
-  "I32";
-}
-
-
-sub C_constant_prefix_param {
-  "aTHX_ ";
-}
-
-sub C_constant_prefix_param_defintion {
-  "pTHX_ ";
-}
-
-sub namelen_param_definition {
-  'I32 ' . $_[0] -> namelen_param;
-}
-
-package main;
+use warnings;
 
 my @pos = qw(__DATA__ __END__ AUTOLOAD BEGIN CHECK DESTROY do delete defined
             END else eval elsif exists for format foreach grep goto glob INIT
@@ -83,224 +34,45 @@ my @neg = qw(__FILE__ __LINE__ __PACKAGE__ and abs alarm atan2 accept bless
             times telldir truncate uc utime umask unpack unlink unshift
             ucfirst values vec warn wait write waitpid wantarray x xor);
 
-my %frequencies = (map {/(.*):\t(.*)/} <DATA>);
+my %pos = map { ($_ => 1) } @pos;
+
+my $t = Devel::Tokenizer::C->new( TokenFunc     => \&perl_keyword
+                                , TokenString   => 'name'
+                                , StringLength  => 'len'
+                                , MergeSwitches => 1
+                                );
+
+$t->add_tokens(@pos, @neg, 'elseif');
 
-my @names;
-push @names, map {{name=>$_, type=>"pos", weight=>$frequencies{$_}}} @pos;
-push @names, map {{name=>$_, type=>"neg", weight=>$frequencies{$_}}} @neg;
-push @names, {name=>'elseif', type=>\"", value=><<'EOC'};
-/* This is somewhat hacky.  */
+my $switch = $t->generate(Indent => '  ');
+
+print <<END;
+/*
+ *  The following code was generated by $0.
+ */
+
+I32
+Perl_keyword (pTHX_ char *name, I32 len)
+{
+$switch
+unknown:
+  return 0;
+}
+END
+
+sub perl_keyword
+{
+  my $k = shift;
+  my $sign = $pos{$k} ? '' : '-';
+
+  if ($k eq 'elseif') {
+    return <<END;
 if(ckWARN_d(WARN_SYNTAX))
   Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
-break;
-EOC
-
-print Toke->C_constant ({subname=>'Perl_keyword', breakout=>~0}, @names);
+END
+  }
 
-__DATA__
-my:    3785925
-if:    2482605
-sub:   2053554
-return:        1401629
-unless:        913955
-shift: 904125
-eq:    797065
-defined:       694277
-use:   686081
-else:  527806
-qw:    415641
-or:    405163
-s:     403691
-require:       375220
-ref:   347102
-elsif: 322365
-undef: 311156
-and:   284867
-foreach:       281720
-local: 262973
-push:  256975
-package:       245661
-print: 220904
-our:   194417
-die:   192203
-length:        163975
-next:  153355
-m:     148776
-caller:        148457
-exists:        145939
-eval:  136977
-keys:  131427
-join:  130820
-substr:        121344
-while: 120305
-for:   118158
-map:   115207
-ne:    112906
-__END__:       112636
-vec:   110566
-goto:  109258
-do:    96004
-last:  95078
-split: 93678
-warn:  91372
-grep:  75912
-delete:        74966
-sprintf:       72704
-q:     69076
-bless: 62111
-no:    61989
-not:   55868
-qq:    55149
-index: 51465
-CORE:  47391
-pop:   46933
-close: 44077
-scalar:        43953
-wantarray:     43024
-open:  39060
-x:     38549
-lc:    38487
-__PACKAGE__:   36767
-stat:  36702
-unshift:       36504
-sort:  36394
-chr:   35654
-time:  32168
-qr:    28519
-splice:        25143
-BEGIN: 24125
-tr:    22665
-chomp: 22337
-ord:   22221
-chdir: 20317
-unlink:        18616
-int:   18549
-chmod: 18455
-each:  18414
-uc:    16961
-pack:  14491
-lstat: 13859
-binmode:       12301
-select:        12209
-closedir:      11986
-readdir:       11716
-reverse:       10571
-chop:  10172
-tie:   10131
-values:        10110
-tied:  9749
-read:  9434
-opendir:       9007
-fileno:        8591
-exit:  8262
-localtime:     7993
-unpack:        7849
-abs:   7767
-printf:        6874
-cmp:   6808
-ge:    5666
-pos:   5503
-redo:  5219
-rindex:        5005
-rename:        4918
-syswrite:      4437
-system:        4326
-lock:  4210
-oct:   4195
-le:    4052
-gmtime:        4040
-utime: 3849
-sysread:       3729
-hex:   3629
-END:   3565
-quotemeta:     3120
-mkdir: 2951
-continue:      2925
-AUTOLOAD:      2713
-tell:  2578
-write: 2525
-rmdir: 2493
-seek:  2174
-glob:  2172
-study: 1933
-rand:  1824
-format:        1735
-umask: 1658
-eof:   1618
-prototype:     1602
-readlink:      1537
-truncate:      1351
-fcntl: 1257
-sysopen:       1230
-ucfirst:       1012
-getc:  981
-gethostbyname: 970
-ioctl: 967
-formline:      959
-gt:    897
-__FILE__:      888
-until: 818
-sqrt:  766
-getprotobyname:        755
-sysseek:       721
-getpeername:   713
-getpwuid:      681
-xor:   619
-y:     567
-syscall:       560
-CHECK: 538
-connect:       526
-err:   522
-sleep: 519
-sin:   499
-send:  496
-getpwnam:      483
-cos:   447
-exec:  429
-link:  425
-exp:   423
-untie: 420
-INIT:  418
-waitpid:       414
-__DATA__:      395
-symlink:       386
-kill:  382
-setsockopt:    356
-atan2: 350
-pipe:  344
-lt:    335
-fork:  327
-times: 310
-getservbyname: 299
-telldir:       294
-bind:  290
-dump:  274
-flock: 260
-recv:  250
-getsockopt:    243
-getsockname:   235
-accept:        233
-getprotobynumber:      232
-rewinddir:     218
-__LINE__:      209
-qx:    177
-lcfirst:       165
-getlogin:      158
-reset: 127
-gethostbyaddr: 68
-getgrgid:      67
-srand: 41
-chown: 34
-seekdir:       20
-readline:      19
-semctl:        17
-getpwent:      12
-getgrnam:      11
-getppid:       10
-crypt: 8
-DESTROY:       7
-getpriority:   5
-getservent:    4
-gethostent:    3
-setpriority:   2
-setnetent:     1
+  return <<END;
+return ${sign}KEY_$k;
+END
+}
diff --git a/toke.c b/toke.c
index 6206c44..d666ce2 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -5585,1340 +5585,3349 @@ S_pending_ident(pTHX)
     return WORD;
 }
 
-/* Weights are the number of occurrences of that keyword in about 135M of
-   input to Perl_keyword from a lot of real perl. This routine is about 20%
-   faster than the routine it replaces.  */
+/*
+ *  The following code was generated by perl_keyword.pl.
+ */
 
 I32
-Perl_keyword (pTHX_ char *name, I32 len) {
-  /* Initially switch on the length of the name.  */
-  switch (len) {
-  case 1:
-    /* Names all of length 1.  */
-    /* m q s x y */
-    /* Offset 0 gives the best switch position.  */
-    switch (name[0]) {
-    case 'm':
+Perl_keyword (pTHX_ char *name, I32 len)
+{
+  switch (len)
+  {
+    case 1: /* 5 tokens of length 1 */
+      switch (name[0])
       {
-        return KEY_m; /* Weight 148776 */
+        case 'm':
+          {                                       /* m          */
+            return KEY_m;
+          }
+
+          goto unknown;
+
+        case 'q':
+          {                                       /* q          */
+            return KEY_q;
+          }
+
+          goto unknown;
+
+        case 's':
+          {                                       /* s          */
+            return KEY_s;
+          }
+
+          goto unknown;
+
+        case 'x':
+          {                                       /* x          */
+            return -KEY_x;
+          }
+
+          goto unknown;
+
+        case 'y':
+          {                                       /* y          */
+            return KEY_y;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
       }
-      break;
-    case 'q':
+
+    case 2: /* 18 tokens of length 2 */
+      switch (name[0])
       {
-        return KEY_q; /* Weight 69076 */
+        case 'd':
+          if (name[1] == 'o')
+          {                                       /* do         */
+            return KEY_do;
+          }
+
+          goto unknown;
+
+        case 'e':
+          if (name[1] == 'q')
+          {                                       /* eq         */
+            return -KEY_eq;
+          }
+
+          goto unknown;
+
+        case 'g':
+          switch (name[1])
+          {
+            case 'e':
+              {                                   /* ge         */
+                return -KEY_ge;
+              }
+
+              goto unknown;
+
+            case 't':
+              {                                   /* gt         */
+                return -KEY_gt;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'i':
+          if (name[1] == 'f')
+          {                                       /* if         */
+            return KEY_if;
+          }
+
+          goto unknown;
+
+        case 'l':
+          switch (name[1])
+          {
+            case 'c':
+              {                                   /* lc         */
+                return -KEY_lc;
+              }
+
+              goto unknown;
+
+            case 'e':
+              {                                   /* le         */
+                return -KEY_le;
+              }
+
+              goto unknown;
+
+            case 't':
+              {                                   /* lt         */
+                return -KEY_lt;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'm':
+          if (name[1] == 'y')
+          {                                       /* my         */
+            return KEY_my;
+          }
+
+          goto unknown;
+
+        case 'n':
+          switch (name[1])
+          {
+            case 'e':
+              {                                   /* ne         */
+                return -KEY_ne;
+              }
+
+              goto unknown;
+
+            case 'o':
+              {                                   /* no         */
+                return KEY_no;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'o':
+          if (name[1] == 'r')
+          {                                       /* or         */
+            return -KEY_or;
+          }
+
+          goto unknown;
+
+        case 'q':
+          switch (name[1])
+          {
+            case 'q':
+              {                                   /* qq         */
+                return KEY_qq;
+              }
+
+              goto unknown;
+
+            case 'r':
+              {                                   /* qr         */
+                return KEY_qr;
+              }
+
+              goto unknown;
+
+            case 'w':
+              {                                   /* qw         */
+                return KEY_qw;
+              }
+
+              goto unknown;
+
+            case 'x':
+              {                                   /* qx         */
+                return KEY_qx;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 't':
+          if (name[1] == 'r')
+          {                                       /* tr         */
+            return KEY_tr;
+          }
+
+          goto unknown;
+
+        case 'u':
+          if (name[1] == 'c')
+          {                                       /* uc         */
+            return -KEY_uc;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
       }
-      break;
-    case 's':
+
+    case 3: /* 28 tokens of length 3 */
+      switch (name[0])
       {
-        return KEY_s; /* Weight 403691 */
+        case 'E':
+          if (name[1] == 'N' &&
+              name[2] == 'D')
+          {                                       /* END        */
+            return KEY_END;
+          }
+
+          goto unknown;
+
+        case 'a':
+          switch (name[1])
+          {
+            case 'b':
+              if (name[2] == 's')
+              {                                   /* abs        */
+                return -KEY_abs;
+              }
+
+              goto unknown;
+
+            case 'n':
+              if (name[2] == 'd')
+              {                                   /* and        */
+                return -KEY_and;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'c':
+          switch (name[1])
+          {
+            case 'h':
+              if (name[2] == 'r')
+              {                                   /* chr        */
+                return -KEY_chr;
+              }
+
+              goto unknown;
+
+            case 'm':
+              if (name[2] == 'p')
+              {                                   /* cmp        */
+                return -KEY_cmp;
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 's')
+              {                                   /* cos        */
+                return -KEY_cos;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'd':
+          if (name[1] == 'i' &&
+              name[2] == 'e')
+          {                                       /* die        */
+            return -KEY_die;
+          }
+
+          goto unknown;
+
+        case 'e':
+          switch (name[1])
+          {
+            case 'o':
+              if (name[2] == 'f')
+              {                                   /* eof        */
+                return -KEY_eof;
+              }
+
+              goto unknown;
+
+            case 'r':
+              if (name[2] == 'r')
+              {                                   /* err        */
+                return -KEY_err;
+              }
+
+              goto unknown;
+
+            case 'x':
+              if (name[2] == 'p')
+              {                                   /* exp        */
+                return -KEY_exp;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'f':
+          if (name[1] == 'o' &&
+              name[2] == 'r')
+          {                                       /* for        */
+            return KEY_for;
+          }
+
+          goto unknown;
+
+        case 'h':
+          if (name[1] == 'e' &&
+              name[2] == 'x')
+          {                                       /* hex        */
+            return -KEY_hex;
+          }
+
+          goto unknown;
+
+        case 'i':
+          if (name[1] == 'n' &&
+              name[2] == 't')
+          {                                       /* int        */
+            return -KEY_int;
+          }
+
+          goto unknown;
+
+        case 'l':
+          if (name[1] == 'o' &&
+              name[2] == 'g')
+          {                                       /* log        */
+            return -KEY_log;
+          }
+
+          goto unknown;
+
+        case 'm':
+          if (name[1] == 'a' &&
+              name[2] == 'p')
+          {                                       /* map        */
+            return KEY_map;
+          }
+
+          goto unknown;
+
+        case 'n':
+          if (name[1] == 'o' &&
+              name[2] == 't')
+          {                                       /* not        */
+            return -KEY_not;
+          }
+
+          goto unknown;
+
+        case 'o':
+          switch (name[1])
+          {
+            case 'c':
+              if (name[2] == 't')
+              {                                   /* oct        */
+                return -KEY_oct;
+              }
+
+              goto unknown;
+
+            case 'r':
+              if (name[2] == 'd')
+              {                                   /* ord        */
+                return -KEY_ord;
+              }
+
+              goto unknown;
+
+            case 'u':
+              if (name[2] == 'r')
+              {                                   /* our        */
+                return KEY_our;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'p':
+          if (name[1] == 'o')
+          {
+            switch (name[2])
+            {
+              case 'p':
+                {                                 /* pop        */
+                  return -KEY_pop;
+                }
+
+                goto unknown;
+
+              case 's':
+                {                                 /* pos        */
+                  return KEY_pos;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'r':
+          if (name[1] == 'e' &&
+              name[2] == 'f')
+          {                                       /* ref        */
+            return -KEY_ref;
+          }
+
+          goto unknown;
+
+        case 's':
+          switch (name[1])
+          {
+            case 'i':
+              if (name[2] == 'n')
+              {                                   /* sin        */
+                return -KEY_sin;
+              }
+
+              goto unknown;
+
+            case 'u':
+              if (name[2] == 'b')
+              {                                   /* sub        */
+                return KEY_sub;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 't':
+          if (name[1] == 'i' &&
+              name[2] == 'e')
+          {                                       /* tie        */
+            return KEY_tie;
+          }
+
+          goto unknown;
+
+        case 'u':
+          if (name[1] == 's' &&
+              name[2] == 'e')
+          {                                       /* use        */
+            return KEY_use;
+          }
+
+          goto unknown;
+
+        case 'v':
+          if (name[1] == 'e' &&
+              name[2] == 'c')
+          {                                       /* vec        */
+            return -KEY_vec;
+          }
+
+          goto unknown;
+
+        case 'x':
+          if (name[1] == 'o' &&
+              name[2] == 'r')
+          {                                       /* xor        */
+            return -KEY_xor;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
       }
-      break;
-    case 'x':
+
+    case 4: /* 40 tokens of length 4 */
+      switch (name[0])
       {
-        return -KEY_x; /* Weight 38549 */
+        case 'C':
+          if (name[1] == 'O' &&
+              name[2] == 'R' &&
+              name[3] == 'E')
+          {                                       /* CORE       */
+            return -KEY_CORE;
+          }
+
+          goto unknown;
+
+        case 'I':
+          if (name[1] == 'N' &&
+              name[2] == 'I' &&
+              name[3] == 'T')
+          {                                       /* INIT       */
+            return KEY_INIT;
+          }
+
+          goto unknown;
+
+        case 'b':
+          if (name[1] == 'i' &&
+              name[2] == 'n' &&
+              name[3] == 'd')
+          {                                       /* bind       */
+            return -KEY_bind;
+          }
+
+          goto unknown;
+
+        case 'c':
+          if (name[1] == 'h' &&
+              name[2] == 'o' &&
+              name[3] == 'p')
+          {                                       /* chop       */
+            return -KEY_chop;
+          }
+
+          goto unknown;
+
+        case 'd':
+          if (name[1] == 'u' &&
+              name[2] == 'm' &&
+              name[3] == 'p')
+          {                                       /* dump       */
+            return -KEY_dump;
+          }
+
+          goto unknown;
+
+        case 'e':
+          switch (name[1])
+          {
+            case 'a':
+              if (name[2] == 'c' &&
+                  name[3] == 'h')
+              {                                   /* each       */
+                return -KEY_each;
+              }
+
+              goto unknown;
+
+            case 'l':
+              if (name[2] == 's' &&
+                  name[3] == 'e')
+              {                                   /* else       */
+                return KEY_else;
+              }
+
+              goto unknown;
+
+            case 'v':
+              if (name[2] == 'a' &&
+                  name[3] == 'l')
+              {                                   /* eval       */
+                return KEY_eval;
+              }
+
+              goto unknown;
+
+            case 'x':
+              switch (name[2])
+              {
+                case 'e':
+                  if (name[3] == 'c')
+                  {                               /* exec       */
+                    return -KEY_exec;
+                  }
+
+                  goto unknown;
+
+                case 'i':
+                  if (name[3] == 't')
+                  {                               /* exit       */
+                    return -KEY_exit;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            default:
+              goto unknown;
+          }
+
+        case 'f':
+          if (name[1] == 'o' &&
+              name[2] == 'r' &&
+              name[3] == 'k')
+          {                                       /* fork       */
+            return -KEY_fork;
+          }
+
+          goto unknown;
+
+        case 'g':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 't' &&
+                  name[3] == 'c')
+              {                                   /* getc       */
+                return -KEY_getc;
+              }
+
+              goto unknown;
+
+            case 'l':
+              if (name[2] == 'o' &&
+                  name[3] == 'b')
+              {                                   /* glob       */
+                return KEY_glob;
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 't' &&
+                  name[3] == 'o')
+              {                                   /* goto       */
+                return KEY_goto;
+              }
+
+              goto unknown;
+
+            case 'r':
+              if (name[2] == 'e' &&
+                  name[3] == 'p')
+              {                                   /* grep       */
+                return KEY_grep;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'j':
+          if (name[1] == 'o' &&
+              name[2] == 'i' &&
+              name[3] == 'n')
+          {                                       /* join       */
+            return -KEY_join;
+          }
+
+          goto unknown;
+
+        case 'k':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 'y' &&
+                  name[3] == 's')
+              {                                   /* keys       */
+                return -KEY_keys;
+              }
+
+              goto unknown;
+
+            case 'i':
+              if (name[2] == 'l' &&
+                  name[3] == 'l')
+              {                                   /* kill       */
+                return -KEY_kill;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'l':
+          switch (name[1])
+          {
+            case 'a':
+              if (name[2] == 's' &&
+                  name[3] == 't')
+              {                                   /* last       */
+                return KEY_last;
+              }
+
+              goto unknown;
+
+            case 'i':
+              if (name[2] == 'n' &&
+                  name[3] == 'k')
+              {                                   /* link       */
+                return -KEY_link;
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 'c' &&
+                  name[3] == 'k')
+              {                                   /* lock       */
+                return -KEY_lock;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'n':
+          if (name[1] == 'e' &&
+              name[2] == 'x' &&
+              name[3] == 't')
+          {                                       /* next       */
+            return KEY_next;
+          }
+
+          goto unknown;
+
+        case 'o':
+          if (name[1] == 'p' &&
+              name[2] == 'e' &&
+              name[3] == 'n')
+          {                                       /* open       */
+            return -KEY_open;
+          }
+
+          goto unknown;
+
+        case 'p':
+          switch (name[1])
+          {
+            case 'a':
+              if (name[2] == 'c' &&
+                  name[3] == 'k')
+              {                                   /* pack       */
+                return -KEY_pack;
+              }
+
+              goto unknown;
+
+            case 'i':
+              if (name[2] == 'p' &&
+                  name[3] == 'e')
+              {                                   /* pipe       */
+                return -KEY_pipe;
+              }
+
+              goto unknown;
+
+            case 'u':
+              if (name[2] == 's' &&
+                  name[3] == 'h')
+              {                                   /* push       */
+                return -KEY_push;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'r':
+          switch (name[1])
+          {
+            case 'a':
+              if (name[2] == 'n' &&
+                  name[3] == 'd')
+              {                                   /* rand       */
+                return -KEY_rand;
+              }
+
+              goto unknown;
+
+            case 'e':
+              switch (name[2])
+              {
+                case 'a':
+                  if (name[3] == 'd')
+                  {                               /* read       */
+                    return -KEY_read;
+                  }
+
+                  goto unknown;
+
+                case 'c':
+                  if (name[3] == 'v')
+                  {                               /* recv       */
+                    return -KEY_recv;
+                  }
+
+                  goto unknown;
+
+                case 'd':
+                  if (name[3] == 'o')
+                  {                               /* redo       */
+                    return KEY_redo;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            default:
+              goto unknown;
+          }
+
+        case 's':
+          switch (name[1])
+          {
+            case 'e':
+              switch (name[2])
+              {
+                case 'e':
+                  if (name[3] == 'k')
+                  {                               /* seek       */
+                    return -KEY_seek;
+                  }
+
+                  goto unknown;
+
+                case 'n':
+                  if (name[3] == 'd')
+                  {                               /* send       */
+                    return -KEY_send;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            case 'o':
+              if (name[2] == 'r' &&
+                  name[3] == 't')
+              {                                   /* sort       */
+                return KEY_sort;
+              }
+
+              goto unknown;
+
+            case 'q':
+              if (name[2] == 'r' &&
+                  name[3] == 't')
+              {                                   /* sqrt       */
+                return -KEY_sqrt;
+              }
+
+              goto unknown;
+
+            case 't':
+              if (name[2] == 'a' &&
+                  name[3] == 't')
+              {                                   /* stat       */
+                return -KEY_stat;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 't':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 'l' &&
+                  name[3] == 'l')
+              {                                   /* tell       */
+                return -KEY_tell;
+              }
+
+              goto unknown;
+
+            case 'i':
+              switch (name[2])
+              {
+                case 'e':
+                  if (name[3] == 'd')
+                  {                               /* tied       */
+                    return KEY_tied;
+                  }
+
+                  goto unknown;
+
+                case 'm':
+                  if (name[3] == 'e')
+                  {                               /* time       */
+                    return -KEY_time;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            default:
+              goto unknown;
+          }
+
+        case 'w':
+          if (name[1] == 'a')
+          {
+            switch (name[2])
+            {
+              case 'i':
+                if (name[3] == 't')
+                {                                 /* wait       */
+                  return -KEY_wait;
+                }
+
+                goto unknown;
+
+              case 'r':
+                if (name[3] == 'n')
+                {                                 /* warn       */
+                  return -KEY_warn;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
       }
-      break;
-    case 'y':
+
+    case 5: /* 36 tokens of length 5 */
+      switch (name[0])
       {
-        return KEY_y; /* Weight 567 */
-      }
-      break;
-    }
-    break;
-  case 2:
-    /* Names all of length 2.  */
-    /* do eq ge gt if lc le lt my ne no or qq qr qw qx tr uc */
-    /* Offset 0 gives the best switch position.  */
-    switch (name[0]) {
-    case 'd':
-      if (name[1] == 'o') {
-        return KEY_do; /* Weight 96004 */
-      }
-      break;
-    case 'e':
-      if (name[1] == 'q') {
-        return -KEY_eq; /* Weight 797065 */
-      }
-      break;
-    case 'g':
-      if (name[1] == 'e') {
-        return -KEY_ge; /* Weight 5666 */
-      }
-      if (name[1] == 't') {
-        return -KEY_gt; /* Weight 897 */
-      }
-      break;
-    case 'i':
-      if (name[1] == 'f') {
-        return KEY_if; /* Weight 2482605 */
-      }
-      break;
-    case 'l':
-      if (name[1] == 'c') {
-        return -KEY_lc; /* Weight 38487 */
-      }
-      if (name[1] == 'e') {
-        return -KEY_le; /* Weight 4052 */
-      }
-      if (name[1] == 't') {
-        return -KEY_lt; /* Weight 335 */
-      }
-      break;
-    case 'm':
-      if (name[1] == 'y') {
-        return KEY_my; /* Weight 3785925 */
-      }
-      break;
-    case 'n':
-      if (name[1] == 'e') {
-        return -KEY_ne; /* Weight 112906 */
-      }
-      if (name[1] == 'o') {
-        return KEY_no; /* Weight 61989 */
-      }
-      break;
-    case 'o':
-      if (name[1] == 'r') {
-        return -KEY_or; /* Weight 405163 */
-      }
-      break;
-    case 'q':
-      if (name[1] == 'w') {
-        return KEY_qw; /* Weight 415641 */
-      }
-      if (name[1] == 'q') {
-        return KEY_qq; /* Weight 55149 */
-      }
-      if (name[1] == 'r') {
-        return KEY_qr; /* Weight 28519 */
-      }
-      if (name[1] == 'x') {
-        return KEY_qx; /* Weight 177 */
-      }
-      break;
-    case 't':
-      if (name[1] == 'r') {
-        return KEY_tr; /* Weight 22665 */
-      }
-      break;
-    case 'u':
-      if (name[1] == 'c') {
-        return -KEY_uc; /* Weight 16961 */
-      }
-      break;
-    }
-    break;
-  case 3:
-    /* Names all of length 3.  */
-    /* END abs and chr cmp cos die eof err exp for hex int log map not oct ord
-       our pop pos ref sin sub tie use vec xor */
-    /* Offset 0 gives the best switch position.  */
-    switch (*name++) {
-    case 'E':
-      if (name[0] == 'N' && name[1] == 'D') {
-        return KEY_END; /* Weight 3565 */
-      }
-      break;
-    case 'a':
-      if (name[0] == 'n' && name[1] == 'd') {
-        return -KEY_and; /* Weight 284867 */
-      }
-      if (name[0] == 'b' && name[1] == 's') {
-        return -KEY_abs; /* Weight 7767 */
-      }
-      break;
-    case 'c':
-      if (name[0] == 'h' && name[1] == 'r') {
-        return -KEY_chr; /* Weight 35654 */
-      }
-      if (name[0] == 'm' && name[1] == 'p') {
-        return -KEY_cmp; /* Weight 6808 */
-      }
-      if (name[0] == 'o' && name[1] == 's') {
-        return -KEY_cos; /* Weight 447 */
-      }
-      break;
-    case 'd':
-      if (name[0] == 'i' && name[1] == 'e') {
-        return -KEY_die; /* Weight 192203 */
-      }
-      break;
-    case 'e':
-      if (name[0] == 'o' && name[1] == 'f') {
-        return -KEY_eof; /* Weight 1618 */
-      }
-      if (name[0] == 'r' && name[1] == 'r') {
-        return -KEY_err; /* Weight 522 */
-      }
-      if (name[0] == 'x' && name[1] == 'p') {
-        return -KEY_exp; /* Weight 423 */
-      }
-      break;
-    case 'f':
-      if (name[0] == 'o' && name[1] == 'r') {
-        return KEY_for; /* Weight 118158 */
-      }
-      break;
-    case 'h':
-      if (name[0] == 'e' && name[1] == 'x') {
-        return -KEY_hex; /* Weight 3629 */
-      }
-      break;
-    case 'i':
-      if (name[0] == 'n' && name[1] == 't') {
-        return -KEY_int; /* Weight 18549 */
-      }
-      break;
-    case 'l':
-      if (name[0] == 'o' && name[1] == 'g') {
-        return -KEY_log;
-      }
-      break;
-    case 'm':
-      if (name[0] == 'a' && name[1] == 'p') {
-        return KEY_map; /* Weight 115207 */
-      }
-      break;
-    case 'n':
-      if (name[0] == 'o' && name[1] == 't') {
-        return -KEY_not; /* Weight 55868 */
-      }
-      break;
-    case 'o':
-      if (name[0] == 'u' && name[1] == 'r') {
-        return KEY_our; /* Weight 194417 */
-      }
-      if (name[0] == 'r' && name[1] == 'd') {
-        return -KEY_ord; /* Weight 22221 */
-      }
-      if (name[0] == 'c' && name[1] == 't') {
-        return -KEY_oct; /* Weight 4195 */
-      }
-      break;
-    case 'p':
-      if (name[0] == 'o' && name[1] == 'p') {
-        return -KEY_pop; /* Weight 46933 */
-      }
-      if (name[0] == 'o' && name[1] == 's') {
-        return KEY_pos; /* Weight 5503 */
-      }
-      break;
-    case 'r':
-      if (name[0] == 'e' && name[1] == 'f') {
-        return -KEY_ref; /* Weight 347102 */
-      }
-      break;
-    case 's':
-      if (name[0] == 'u' && name[1] == 'b') {
-        return KEY_sub; /* Weight 2053554 */
-      }
-      if (name[0] == 'i' && name[1] == 'n') {
-        return -KEY_sin; /* Weight 499 */
-      }
-      break;
-    case 't':
-      if (name[0] == 'i' && name[1] == 'e') {
-        return KEY_tie; /* Weight 10131 */
-      }
-      break;
-    case 'u':
-      if (name[0] == 's' && name[1] == 'e') {
-        return KEY_use; /* Weight 686081 */
-      }
-      break;
-    case 'v':
-      if (name[0] == 'e' && name[1] == 'c') {
-        return -KEY_vec; /* Weight 110566 */
-      }
-      break;
-    case 'x':
-      if (name[0] == 'o' && name[1] == 'r') {
-        return -KEY_xor; /* Weight 619 */
-      }
-      break;
-    }
-    break;
-  case 4:
-    /* Names all of length 4.  */
-    /* CORE INIT bind chop dump each else eval exec exit fork getc glob goto
-       grep join keys kill last link lock next open pack pipe push rand read
-       recv redo seek send sort sqrt stat tell tied time wait warn */
-    /* Offset 0 gives the best switch position.  */
-    switch (*name++) {
-    case 'C':
-      if (!memcmp(name, "ORE", 3)) {
-      /*                C         */
-        return -KEY_CORE; /* Weight 47391 */
-      }
-      break;
-    case 'I':
-      if (!memcmp(name, "NIT", 3)) {
-      /*                I         */
-        return KEY_INIT; /* Weight 418 */
-      }
-      break;
-    case 'b':
-      if (!memcmp(name, "ind", 3)) {
-      /*                b         */
-        return -KEY_bind; /* Weight 290 */
-      }
-      break;
-    case 'c':
-      if (!memcmp(name, "hop", 3)) {
-      /*                c         */
-        return -KEY_chop; /* Weight 10172 */
-      }
-      break;
-    case 'd':
-      if (!memcmp(name, "ump", 3)) {
-      /*                d         */
-        return -KEY_dump; /* Weight 274 */
-      }
-      break;
-    case 'e':
-      if (!memcmp(name, "lse", 3)) {
-      /*                e         */
-        return KEY_else; /* Weight 527806 */
-      }
-      if (!memcmp(name, "val", 3)) {
-      /*                e         */
-        return KEY_eval; /* Weight 136977 */
-      }
-      if (!memcmp(name, "ach", 3)) {
-      /*                e         */
-        return -KEY_each; /* Weight 18414 */
-      }
-      if (!memcmp(name, "xit", 3)) {
-      /*                e         */
-        return -KEY_exit; /* Weight 8262 */
-      }
-      if (!memcmp(name, "xec", 3)) {
-      /*                e         */
-        return -KEY_exec; /* Weight 429 */
-      }
-      break;
-    case 'f':
-      if (!memcmp(name, "ork", 3)) {
-      /*                f         */
-        return -KEY_fork; /* Weight 327 */
-      }
-      break;
-    case 'g':
-      if (!memcmp(name, "oto", 3)) {
-      /*                g         */
-        return KEY_goto; /* Weight 109258 */
-      }
-      if (!memcmp(name, "rep", 3)) {
-      /*                g         */
-        return KEY_grep; /* Weight 75912 */
-      }
-      if (!memcmp(name, "lob", 3)) {
-      /*                g         */
-        return KEY_glob; /* Weight 2172 */
-      }
-      if (!memcmp(name, "etc", 3)) {
-      /*                g         */
-        return -KEY_getc; /* Weight 981 */
-      }
-      break;
-    case 'j':
-      if (!memcmp(name, "oin", 3)) {
-      /*                j         */
-        return -KEY_join; /* Weight 130820 */
-      }
-      break;
-    case 'k':
-      if (!memcmp(name, "eys", 3)) {
-      /*                k         */
-        return -KEY_keys; /* Weight 131427 */
-      }
-      if (!memcmp(name, "ill", 3)) {
-      /*                k         */
-        return -KEY_kill; /* Weight 382 */
-      }
-      break;
-    case 'l':
-      if (!memcmp(name, "ast", 3)) {
-      /*                l         */
-        return KEY_last; /* Weight 95078 */
-      }
-      if (!memcmp(name, "ock", 3)) {
-      /*                l         */
-        return -KEY_lock; /* Weight 4210 */
-      }
-      if (!memcmp(name, "ink", 3)) {
-      /*                l         */
-        return -KEY_link; /* Weight 425 */
-      }
-      break;
-    case 'n':
-      if (!memcmp(name, "ext", 3)) {
-      /*                n         */
-        return KEY_next; /* Weight 153355 */
-      }
-      break;
-    case 'o':
-      if (!memcmp(name, "pen", 3)) {
-      /*                o         */
-        return -KEY_open; /* Weight 39060 */
-      }
-      break;
-    case 'p':
-      if (!memcmp(name, "ush", 3)) {
-      /*                p         */
-        return -KEY_push; /* Weight 256975 */
-      }
-      if (!memcmp(name, "ack", 3)) {
-      /*                p         */
-        return -KEY_pack; /* Weight 14491 */
-      }
-      if (!memcmp(name, "ipe", 3)) {
-      /*                p         */
-        return -KEY_pipe; /* Weight 344 */
-      }
-      break;
-    case 'r':
-      if (!memcmp(name, "ead", 3)) {
-      /*                r         */
-        return -KEY_read; /* Weight 9434 */
-      }
-      if (!memcmp(name, "edo", 3)) {
-      /*                r         */
-        return KEY_redo; /* Weight 5219 */
-      }
-      if (!memcmp(name, "and", 3)) {
-      /*                r         */
-        return -KEY_rand; /* Weight 1824 */
-      }
-      if (!memcmp(name, "ecv", 3)) {
-      /*                r         */
-        return -KEY_recv; /* Weight 250 */
-      }
-      break;
-    case 's':
-      if (!memcmp(name, "tat", 3)) {
-      /*                s         */
-        return -KEY_stat; /* Weight 36702 */
-      }
-      if (!memcmp(name, "ort", 3)) {
-      /*                s         */
-        return KEY_sort; /* Weight 36394 */
-      }
-      if (!memcmp(name, "eek", 3)) {
-      /*                s         */
-        return -KEY_seek; /* Weight 2174 */
-      }
-      if (!memcmp(name, "qrt", 3)) {
-      /*                s         */
-        return -KEY_sqrt; /* Weight 766 */
-      }
-      if (!memcmp(name, "end", 3)) {
-      /*                s         */
-        return -KEY_send; /* Weight 496 */
-      }
-      break;
-    case 't':
-      if (!memcmp(name, "ime", 3)) {
-      /*                t         */
-        return -KEY_time; /* Weight 32168 */
-      }
-      if (!memcmp(name, "ied", 3)) {
-      /*                t         */
-        return KEY_tied; /* Weight 9749 */
-      }
-      if (!memcmp(name, "ell", 3)) {
-      /*                t         */
-        return -KEY_tell; /* Weight 2578 */
-      }
-      break;
-    case 'w':
-      if (!memcmp(name, "arn", 3)) {
-      /*                w         */
-        return -KEY_warn; /* Weight 91372 */
-      }
-      if (!memcmp(name, "ait", 3)) {
-      /*                w         */
-        return -KEY_wait;
-      }
-      break;
-    }
-    break;
-  case 5:
-    /* Names all of length 5.  */
-    /* BEGIN CHECK alarm atan2 bless chdir chmod chomp chown close crypt elsif
-       fcntl flock index ioctl local lstat mkdir print reset rmdir semop shift
-       sleep split srand study times umask undef untie until utime while write
-       */
-    /* Offset 3 gives the best switch position.  */
-    switch (name[3]) {
-    case 'C':
-      if (!memcmp(name, "CHECK", 5)) {
-      /*                    ^       */
-        return KEY_CHECK; /* Weight 538 */
-      }
-      break;
-    case 'I':
-      if (!memcmp(name, "BEGIN", 5)) {
-      /*                    ^       */
-        return KEY_BEGIN; /* Weight 24125 */
-      }
-      break;
-    case 'a':
-      if (!memcmp(name, "local", 5)) {
-      /*                    ^       */
-        return KEY_local; /* Weight 262973 */
-      }
-      if (!memcmp(name, "lstat", 5)) {
-      /*                    ^       */
-        return -KEY_lstat; /* Weight 13859 */
-      }
-      break;
-    case 'c':
-      if (!memcmp(name, "flock", 5)) {
-      /*                    ^       */
-        return -KEY_flock; /* Weight 260 */
-      }
-      break;
-    case 'd':
-      if (!memcmp(name, "study", 5)) {
-      /*                    ^       */
-        return KEY_study; /* Weight 1933 */
-      }
-      break;
-    case 'e':
-      if (!memcmp(name, "undef", 5)) {
-      /*                    ^       */
-        return KEY_undef; /* Weight 311156 */
-      }
-      if (!memcmp(name, "index", 5)) {
-      /*                    ^       */
-        return -KEY_index; /* Weight 51465 */
-      }
-      if (!memcmp(name, "sleep", 5)) {
-      /*                    ^       */
-        return -KEY_sleep; /* Weight 519 */
-      }
-      if (!memcmp(name, "times", 5)) {
-      /*                    ^       */
-        return -KEY_times; /* Weight 310 */
-      }
-      if (!memcmp(name, "reset", 5)) {
-      /*                    ^       */
-        return -KEY_reset; /* Weight 127 */
-      }
-      break;
-    case 'f':
-      if (!memcmp(name, "shift", 5)) {
-      /*                    ^       */
-        return -KEY_shift; /* Weight 904125 */
-      }
-      break;
-    case 'i':
-      if (!memcmp(name, "elsif", 5)) {
-      /*                    ^       */
-        return KEY_elsif; /* Weight 322365 */
-      }
-      if (!memcmp(name, "split", 5)) {
-      /*                    ^       */
-        return KEY_split; /* Weight 93678 */
-      }
-      if (!memcmp(name, "chdir", 5)) {
-      /*                    ^       */
-        return -KEY_chdir; /* Weight 20317 */
-      }
-      if (!memcmp(name, "mkdir", 5)) {
-      /*                    ^       */
-        return -KEY_mkdir; /* Weight 2951 */
-      }
-      if (!memcmp(name, "rmdir", 5)) {
-      /*                    ^       */
-        return -KEY_rmdir; /* Weight 2493 */
-      }
-      if (!memcmp(name, "until", 5)) {
-      /*                    ^       */
-        return KEY_until; /* Weight 818 */
-      }
-      if (!memcmp(name, "untie", 5)) {
-      /*                    ^       */
-        return KEY_untie; /* Weight 420 */
-      }
-      break;
-    case 'l':
-      if (!memcmp(name, "while", 5)) {
-      /*                    ^       */
-        return KEY_while; /* Weight 120305 */
-      }
-      break;
-    case 'm':
-      if (!memcmp(name, "chomp", 5)) {
-      /*                    ^       */
-        return -KEY_chomp; /* Weight 22337 */
+        case 'B':
+          if (name[1] == 'E' &&
+              name[2] == 'G' &&
+              name[3] == 'I' &&
+              name[4] == 'N')
+          {                                       /* BEGIN      */
+            return KEY_BEGIN;
+          }
+
+          goto unknown;
+
+        case 'C':
+          if (name[1] == 'H' &&
+              name[2] == 'E' &&
+              name[3] == 'C' &&
+              name[4] == 'K')
+          {                                       /* CHECK      */
+            return KEY_CHECK;
+          }
+
+          goto unknown;
+
+        case 'a':
+          switch (name[1])
+          {
+            case 'l':
+              if (name[2] == 'a' &&
+                  name[3] == 'r' &&
+                  name[4] == 'm')
+              {                                   /* alarm      */
+                return -KEY_alarm;
+              }
+
+              goto unknown;
+
+            case 't':
+              if (name[2] == 'a' &&
+                  name[3] == 'n' &&
+                  name[4] == '2')
+              {                                   /* atan2      */
+                return -KEY_atan2;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'b':
+          if (name[1] == 'l' &&
+              name[2] == 'e' &&
+              name[3] == 's' &&
+              name[4] == 's')
+          {                                       /* bless      */
+            return -KEY_bless;
+          }
+
+          goto unknown;
+
+        case 'c':
+          switch (name[1])
+          {
+            case 'h':
+              switch (name[2])
+              {
+                case 'd':
+                  if (name[3] == 'i' &&
+                      name[4] == 'r')
+                  {                               /* chdir      */
+                    return -KEY_chdir;
+                  }
+
+                  goto unknown;
+
+                case 'm':
+                  if (name[3] == 'o' &&
+                      name[4] == 'd')
+                  {                               /* chmod      */
+                    return -KEY_chmod;
+                  }
+
+                  goto unknown;
+
+                case 'o':
+                  switch (name[3])
+                  {
+                    case 'm':
+                      if (name[4] == 'p')
+                      {                           /* chomp      */
+                        return -KEY_chomp;
+                      }
+
+                      goto unknown;
+
+                    case 'w':
+                      if (name[4] == 'n')
+                      {                           /* chown      */
+                        return -KEY_chown;
+                      }
+
+                      goto unknown;
+
+                    default:
+                      goto unknown;
+                  }
+
+                default:
+                  goto unknown;
+              }
+
+            case 'l':
+              if (name[2] == 'o' &&
+                  name[3] == 's' &&
+                  name[4] == 'e')
+              {                                   /* close      */
+                return -KEY_close;
+              }
+
+              goto unknown;
+
+            case 'r':
+              if (name[2] == 'y' &&
+                  name[3] == 'p' &&
+                  name[4] == 't')
+              {                                   /* crypt      */
+                return -KEY_crypt;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'e':
+          if (name[1] == 'l' &&
+              name[2] == 's' &&
+              name[3] == 'i' &&
+              name[4] == 'f')
+          {                                       /* elsif      */
+            return KEY_elsif;
+          }
+
+          goto unknown;
+
+        case 'f':
+          switch (name[1])
+          {
+            case 'c':
+              if (name[2] == 'n' &&
+                  name[3] == 't' &&
+                  name[4] == 'l')
+              {                                   /* fcntl      */
+                return -KEY_fcntl;
+              }
+
+              goto unknown;
+
+            case 'l':
+              if (name[2] == 'o' &&
+                  name[3] == 'c' &&
+                  name[4] == 'k')
+              {                                   /* flock      */
+                return -KEY_flock;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'i':
+          switch (name[1])
+          {
+            case 'n':
+              if (name[2] == 'd' &&
+                  name[3] == 'e' &&
+                  name[4] == 'x')
+              {                                   /* index      */
+                return -KEY_index;
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 'c' &&
+                  name[3] == 't' &&
+                  name[4] == 'l')
+              {                                   /* ioctl      */
+                return -KEY_ioctl;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'l':
+          switch (name[1])
+          {
+            case 'o':
+              if (name[2] == 'c' &&
+                  name[3] == 'a' &&
+                  name[4] == 'l')
+              {                                   /* local      */
+                return KEY_local;
+              }
+
+              goto unknown;
+
+            case 's':
+              if (name[2] == 't' &&
+                  name[3] == 'a' &&
+                  name[4] == 't')
+              {                                   /* lstat      */
+                return -KEY_lstat;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'm':
+          if (name[1] == 'k' &&
+              name[2] == 'd' &&
+              name[3] == 'i' &&
+              name[4] == 'r')
+          {                                       /* mkdir      */
+            return -KEY_mkdir;
+          }
+
+          goto unknown;
+
+        case 'p':
+          if (name[1] == 'r' &&
+              name[2] == 'i' &&
+              name[3] == 'n' &&
+              name[4] == 't')
+          {                                       /* print      */
+            return KEY_print;
+          }
+
+          goto unknown;
+
+        case 'r':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 's' &&
+                  name[3] == 'e' &&
+                  name[4] == 't')
+              {                                   /* reset      */
+                return -KEY_reset;
+              }
+
+              goto unknown;
+
+            case 'm':
+              if (name[2] == 'd' &&
+                  name[3] == 'i' &&
+                  name[4] == 'r')
+              {                                   /* rmdir      */
+                return -KEY_rmdir;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 's':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 'm' &&
+                  name[3] == 'o' &&
+                  name[4] == 'p')
+              {                                   /* semop      */
+                return -KEY_semop;
+              }
+
+              goto unknown;
+
+            case 'h':
+              if (name[2] == 'i' &&
+                  name[3] == 'f' &&
+                  name[4] == 't')
+              {                                   /* shift      */
+                return -KEY_shift;
+              }
+
+              goto unknown;
+
+            case 'l':
+              if (name[2] == 'e' &&
+                  name[3] == 'e' &&
+                  name[4] == 'p')
+              {                                   /* sleep      */
+                return -KEY_sleep;
+              }
+
+              goto unknown;
+
+            case 'p':
+              if (name[2] == 'l' &&
+                  name[3] == 'i' &&
+                  name[4] == 't')
+              {                                   /* split      */
+                return KEY_split;
+              }
+
+              goto unknown;
+
+            case 'r':
+              if (name[2] == 'a' &&
+                  name[3] == 'n' &&
+                  name[4] == 'd')
+              {                                   /* srand      */
+                return -KEY_srand;
+              }
+
+              goto unknown;
+
+            case 't':
+              if (name[2] == 'u' &&
+                  name[3] == 'd' &&
+                  name[4] == 'y')
+              {                                   /* study      */
+                return KEY_study;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 't':
+          if (name[1] == 'i' &&
+              name[2] == 'm' &&
+              name[3] == 'e' &&
+              name[4] == 's')
+          {                                       /* times      */
+            return -KEY_times;
+          }
+
+          goto unknown;
+
+        case 'u':
+          switch (name[1])
+          {
+            case 'm':
+              if (name[2] == 'a' &&
+                  name[3] == 's' &&
+                  name[4] == 'k')
+              {                                   /* umask      */
+                return -KEY_umask;
+              }
+
+              goto unknown;
+
+            case 'n':
+              switch (name[2])
+              {
+                case 'd':
+                  if (name[3] == 'e' &&
+                      name[4] == 'f')
+                  {                               /* undef      */
+                    return KEY_undef;
+                  }
+
+                  goto unknown;
+
+                case 't':
+                  if (name[3] == 'i')
+                  {
+                    switch (name[4])
+                    {
+                      case 'e':
+                        {                         /* untie      */
+                          return KEY_untie;
+                        }
+
+                        goto unknown;
+
+                      case 'l':
+                        {                         /* until      */
+                          return KEY_until;
+                        }
+
+                        goto unknown;
+
+                      default:
+                        goto unknown;
+                    }
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            case 't':
+              if (name[2] == 'i' &&
+                  name[3] == 'm' &&
+                  name[4] == 'e')
+              {                                   /* utime      */
+                return -KEY_utime;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'w':
+          switch (name[1])
+          {
+            case 'h':
+              if (name[2] == 'i' &&
+                  name[3] == 'l' &&
+                  name[4] == 'e')
+              {                                   /* while      */
+                return KEY_while;
+              }
+
+              goto unknown;
+
+            case 'r':
+              if (name[2] == 'i' &&
+                  name[3] == 't' &&
+                  name[4] == 'e')
+              {                                   /* write      */
+                return -KEY_write;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        default:
+          goto unknown;
       }
-      if (!memcmp(name, "utime", 5)) {
-      /*                    ^       */
-        return -KEY_utime; /* Weight 3849 */
+
+    case 6: /* 33 tokens of length 6 */
+      switch (name[0])
+      {
+        case 'a':
+          if (name[1] == 'c' &&
+              name[2] == 'c' &&
+              name[3] == 'e' &&
+              name[4] == 'p' &&
+              name[5] == 't')
+          {                                       /* accept     */
+            return -KEY_accept;
+          }
+
+          goto unknown;
+
+        case 'c':
+          switch (name[1])
+          {
+            case 'a':
+              if (name[2] == 'l' &&
+                  name[3] == 'l' &&
+                  name[4] == 'e' &&
+                  name[5] == 'r')
+              {                                   /* caller     */
+                return -KEY_caller;
+              }
+
+              goto unknown;
+
+            case 'h':
+              if (name[2] == 'r' &&
+                  name[3] == 'o' &&
+                  name[4] == 'o' &&
+                  name[5] == 't')
+              {                                   /* chroot     */
+                return -KEY_chroot;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'd':
+          if (name[1] == 'e' &&
+              name[2] == 'l' &&
+              name[3] == 'e' &&
+              name[4] == 't' &&
+              name[5] == 'e')
+          {                                       /* delete     */
+            return KEY_delete;
+          }
+
+          goto unknown;
+
+        case 'e':
+          switch (name[1])
+          {
+            case 'l':
+              if (name[2] == 's' &&
+                  name[3] == 'e' &&
+                  name[4] == 'i' &&
+                  name[5] == 'f')
+              {                                   /* elseif     */
+                if(ckWARN_d(WARN_SYNTAX))
+                  Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
+              }
+
+              goto unknown;
+
+            case 'x':
+              if (name[2] == 'i' &&
+                  name[3] == 's' &&
+                  name[4] == 't' &&
+                  name[5] == 's')
+              {                                   /* exists     */
+                return KEY_exists;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'f':
+          switch (name[1])
+          {
+            case 'i':
+              if (name[2] == 'l' &&
+                  name[3] == 'e' &&
+                  name[4] == 'n' &&
+                  name[5] == 'o')
+              {                                   /* fileno     */
+                return -KEY_fileno;
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 'r' &&
+                  name[3] == 'm' &&
+                  name[4] == 'a' &&
+                  name[5] == 't')
+              {                                   /* format     */
+                return KEY_format;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'g':
+          if (name[1] == 'm' &&
+              name[2] == 't' &&
+              name[3] == 'i' &&
+              name[4] == 'm' &&
+              name[5] == 'e')
+          {                                       /* gmtime     */
+            return -KEY_gmtime;
+          }
+
+          goto unknown;
+
+        case 'l':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 'n' &&
+                  name[3] == 'g' &&
+                  name[4] == 't' &&
+                  name[5] == 'h')
+              {                                   /* length     */
+                return -KEY_length;
+              }
+
+              goto unknown;
+
+            case 'i':
+              if (name[2] == 's' &&
+                  name[3] == 't' &&
+                  name[4] == 'e' &&
+                  name[5] == 'n')
+              {                                   /* listen     */
+                return -KEY_listen;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'm':
+          if (name[1] == 's' &&
+              name[2] == 'g')
+          {
+            switch (name[3])
+            {
+              case 'c':
+                if (name[4] == 't' &&
+                    name[5] == 'l')
+                {                                 /* msgctl     */
+                  return -KEY_msgctl;
+                }
+
+                goto unknown;
+
+              case 'g':
+                if (name[4] == 'e' &&
+                    name[5] == 't')
+                {                                 /* msgget     */
+                  return -KEY_msgget;
+                }
+
+                goto unknown;
+
+              case 'r':
+                if (name[4] == 'c' &&
+                    name[5] == 'v')
+                {                                 /* msgrcv     */
+                  return -KEY_msgrcv;
+                }
+
+                goto unknown;
+
+              case 's':
+                if (name[4] == 'n' &&
+                    name[5] == 'd')
+                {                                 /* msgsnd     */
+                  return -KEY_msgsnd;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'p':
+          if (name[1] == 'r' &&
+              name[2] == 'i' &&
+              name[3] == 'n' &&
+              name[4] == 't' &&
+              name[5] == 'f')
+          {                                       /* printf     */
+            return KEY_printf;
+          }
+
+          goto unknown;
+
+        case 'r':
+          switch (name[1])
+          {
+            case 'e':
+              switch (name[2])
+              {
+                case 'n':
+                  if (name[3] == 'a' &&
+                      name[4] == 'm' &&
+                      name[5] == 'e')
+                  {                               /* rename     */
+                    return -KEY_rename;
+                  }
+
+                  goto unknown;
+
+                case 't':
+                  if (name[3] == 'u' &&
+                      name[4] == 'r' &&
+                      name[5] == 'n')
+                  {                               /* return     */
+                    return KEY_return;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            case 'i':
+              if (name[2] == 'n' &&
+                  name[3] == 'd' &&
+                  name[4] == 'e' &&
+                  name[5] == 'x')
+              {                                   /* rindex     */
+                return -KEY_rindex;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 's':
+          switch (name[1])
+          {
+            case 'c':
+              if (name[2] == 'a' &&
+                  name[3] == 'l' &&
+                  name[4] == 'a' &&
+                  name[5] == 'r')
+              {                                   /* scalar     */
+                return KEY_scalar;
+              }
+
+              goto unknown;
+
+            case 'e':
+              switch (name[2])
+              {
+                case 'l':
+                  if (name[3] == 'e' &&
+                      name[4] == 'c' &&
+                      name[5] == 't')
+                  {                               /* select     */
+                    return -KEY_select;
+                  }
+
+                  goto unknown;
+
+                case 'm':
+                  switch (name[3])
+                  {
+                    case 'c':
+                      if (name[4] == 't' &&
+                          name[5] == 'l')
+                      {                           /* semctl     */
+                        return -KEY_semctl;
+                      }
+
+                      goto unknown;
+
+                    case 'g':
+                      if (name[4] == 'e' &&
+                          name[5] == 't')
+                      {                           /* semget     */
+                        return -KEY_semget;
+                      }
+
+                      goto unknown;
+
+                    default:
+                      goto unknown;
+                  }
+
+                default:
+                  goto unknown;
+              }
+
+            case 'h':
+              if (name[2] == 'm')
+              {
+                switch (name[3])
+                {
+                  case 'c':
+                    if (name[4] == 't' &&
+                        name[5] == 'l')
+                    {                             /* shmctl     */
+                      return -KEY_shmctl;
+                    }
+
+                    goto unknown;
+
+                  case 'g':
+                    if (name[4] == 'e' &&
+                        name[5] == 't')
+                    {                             /* shmget     */
+                      return -KEY_shmget;
+                    }
+
+                    goto unknown;
+
+                  default:
+                    goto unknown;
+                }
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 'c' &&
+                  name[3] == 'k' &&
+                  name[4] == 'e' &&
+                  name[5] == 't')
+              {                                   /* socket     */
+                return -KEY_socket;
+              }
+
+              goto unknown;
+
+            case 'p':
+              if (name[2] == 'l' &&
+                  name[3] == 'i' &&
+                  name[4] == 'c' &&
+                  name[5] == 'e')
+              {                                   /* splice     */
+                return -KEY_splice;
+              }
+
+              goto unknown;
+
+            case 'u':
+              if (name[2] == 'b' &&
+                  name[3] == 's' &&
+                  name[4] == 't' &&
+                  name[5] == 'r')
+              {                                   /* substr     */
+                return -KEY_substr;
+              }
+
+              goto unknown;
+
+            case 'y':
+              if (name[2] == 's' &&
+                  name[3] == 't' &&
+                  name[4] == 'e' &&
+                  name[5] == 'm')
+              {                                   /* system     */
+                return -KEY_system;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'u':
+          if (name[1] == 'n')
+          {
+            switch (name[2])
+            {
+              case 'l':
+                switch (name[3])
+                {
+                  case 'e':
+                    if (name[4] == 's' &&
+                        name[5] == 's')
+                    {                             /* unless     */
+                      return KEY_unless;
+                    }
+
+                    goto unknown;
+
+                  case 'i':
+                    if (name[4] == 'n' &&
+                        name[5] == 'k')
+                    {                             /* unlink     */
+                      return -KEY_unlink;
+                    }
+
+                    goto unknown;
+
+                  default:
+                    goto unknown;
+                }
+
+              case 'p':
+                if (name[3] == 'a' &&
+                    name[4] == 'c' &&
+                    name[5] == 'k')
+                {                                 /* unpack     */
+                  return -KEY_unpack;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'v':
+          if (name[1] == 'a' &&
+              name[2] == 'l' &&
+              name[3] == 'u' &&
+              name[4] == 'e' &&
+              name[5] == 's')
+          {                                       /* values     */
+            return -KEY_values;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
       }
-      break;
-    case 'n':
-      if (!memcmp(name, "print", 5)) {
-      /*                    ^       */
-        return KEY_print; /* Weight 220904 */
-      }
-      if (!memcmp(name, "atan2", 5)) {
-      /*                    ^       */
-        return -KEY_atan2; /* Weight 350 */
-      }
-      if (!memcmp(name, "srand", 5)) {
-      /*                    ^       */
-        return -KEY_srand; /* Weight 41 */
-      }
-      break;
-    case 'o':
-      if (!memcmp(name, "chmod", 5)) {
-      /*                    ^       */
-        return -KEY_chmod; /* Weight 18455 */
-      }
-      if (!memcmp(name, "semop", 5)) {
-      /*                    ^       */
-        return -KEY_semop;
-      }
-      break;
-    case 'p':
-      if (!memcmp(name, "crypt", 5)) {
-      /*                    ^       */
-        return -KEY_crypt; /* Weight 8 */
-      }
-      break;
-    case 'r':
-      if (!memcmp(name, "alarm", 5)) {
-      /*                    ^       */
-        return -KEY_alarm;
-      }
-      break;
-    case 's':
-      if (!memcmp(name, "bless", 5)) {
-      /*                    ^       */
-        return -KEY_bless; /* Weight 62111 */
-      }
-      if (!memcmp(name, "close", 5)) {
-      /*                    ^       */
-        return -KEY_close; /* Weight 44077 */
-      }
-      if (!memcmp(name, "umask", 5)) {
-      /*                    ^       */
-        return -KEY_umask; /* Weight 1658 */
-      }
-      break;
-    case 't':
-      if (!memcmp(name, "write", 5)) {
-      /*                    ^       */
-        return -KEY_write; /* Weight 2525 */
-      }
-      if (!memcmp(name, "fcntl", 5)) {
-      /*                    ^       */
-        return -KEY_fcntl; /* Weight 1257 */
-      }
-      if (!memcmp(name, "ioctl", 5)) {
-      /*                    ^       */
-        return -KEY_ioctl; /* Weight 967 */
-      }
-      break;
-    case 'w':
-      if (!memcmp(name, "chown", 5)) {
-      /*                    ^       */
-        return -KEY_chown; /* Weight 34 */
-      }
-      break;
-    }
-    break;
-  case 6:
-    /* Names all of length 6.  */
-    /* accept caller chroot delete elseif exists fileno format gmtime length
-       listen msgctl msgget msgrcv msgsnd printf rename return rindex scalar
-       select semctl semget shmctl shmget socket splice substr system unless
-       unlink unpack values */
-    /* Offset 3 gives the best switch position.  */
-    switch (name[3]) {
-    case 'a':
-      if (!memcmp(name, "unpack", 6)) {
-      /*                    ^        */
-        return -KEY_unpack; /* Weight 7849 */
-      }
-      if (!memcmp(name, "rename", 6)) {
-      /*                    ^        */
-        return -KEY_rename; /* Weight 4918 */
-      }
-      break;
-    case 'c':
-      if (!memcmp(name, "semctl", 6)) {
-      /*                    ^        */
-        return -KEY_semctl; /* Weight 17 */
-      }
-      if (!memcmp(name, "msgctl", 6)) {
-      /*                    ^        */
-        return -KEY_msgctl;
-      }
-      if (!memcmp(name, "shmctl", 6)) {
-      /*                    ^        */
-        return -KEY_shmctl;
-      }
-      break;
-    case 'd':
-      if (!memcmp(name, "rindex", 6)) {
-      /*                    ^        */
-        return -KEY_rindex; /* Weight 5005 */
-      }
-      break;
-    case 'e':
-      if (!memcmp(name, "unless", 6)) {
-      /*                    ^        */
-        return KEY_unless; /* Weight 913955 */
-      }
-      if (!memcmp(name, "delete", 6)) {
-      /*                    ^        */
-        return KEY_delete; /* Weight 74966 */
-      }
-      if (!memcmp(name, "select", 6)) {
-      /*                    ^        */
-        return -KEY_select; /* Weight 12209 */
-      }
-      if (!memcmp(name, "fileno", 6)) {
-      /*                    ^        */
-        return -KEY_fileno; /* Weight 8591 */
-      }
-      if (!memcmp(name, "accept", 6)) {
-      /*                    ^        */
-        return -KEY_accept; /* Weight 233 */
-      }
-      if (!memcmp(name, "elseif", 6)) {
-      /*                    ^        */
-        /* This is somewhat hacky.  */
-       if(ckWARN_d(WARN_SYNTAX))
-         Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif");
-       break;
-      }
-      break;
-    case 'g':
-      if (!memcmp(name, "length", 6)) {
-      /*                    ^        */
-        return -KEY_length; /* Weight 163975 */
-      }
-      if (!memcmp(name, "msgget", 6)) {
-      /*                    ^        */
-        return -KEY_msgget;
-      }
-      if (!memcmp(name, "semget", 6)) {
-      /*                    ^        */
-        return -KEY_semget;
-      }
-      if (!memcmp(name, "shmget", 6)) {
-      /*                    ^        */
-        return -KEY_shmget;
-      }
-      break;
-    case 'i':
-      if (!memcmp(name, "splice", 6)) {
-      /*                    ^        */
-        return -KEY_splice; /* Weight 25143 */
-      }
-      if (!memcmp(name, "unlink", 6)) {
-      /*                    ^        */
-        return -KEY_unlink; /* Weight 18616 */
-      }
-      if (!memcmp(name, "gmtime", 6)) {
-      /*                    ^        */
-        return -KEY_gmtime; /* Weight 4040 */
-      }
-      break;
-    case 'k':
-      if (!memcmp(name, "socket", 6)) {
-      /*                    ^        */
-        return -KEY_socket;
-      }
-      break;
-    case 'l':
-      if (!memcmp(name, "caller", 6)) {
-      /*                    ^        */
-        return -KEY_caller; /* Weight 148457 */
-      }
-      if (!memcmp(name, "scalar", 6)) {
-      /*                    ^        */
-        return KEY_scalar; /* Weight 43953 */
-      }
-      break;
-    case 'm':
-      if (!memcmp(name, "format", 6)) {
-      /*                    ^        */
-        return KEY_format; /* Weight 1735 */
-      }
-      break;
-    case 'n':
-      if (!memcmp(name, "printf", 6)) {
-      /*                    ^        */
-        return KEY_printf; /* Weight 6874 */
-      }
-      break;
-    case 'o':
-      if (!memcmp(name, "chroot", 6)) {
-      /*                    ^        */
-        return -KEY_chroot;
-      }
-      break;
-    case 'r':
-      if (!memcmp(name, "msgrcv", 6)) {
-      /*                    ^        */
-        return -KEY_msgrcv;
-      }
-      break;
-    case 's':
-      if (!memcmp(name, "exists", 6)) {
-      /*                    ^        */
-        return KEY_exists; /* Weight 145939 */
-      }
-      if (!memcmp(name, "substr", 6)) {
-      /*                    ^        */
-        return -KEY_substr; /* Weight 121344 */
-      }
-      if (!memcmp(name, "msgsnd", 6)) {
-      /*                    ^        */
-        return -KEY_msgsnd;
-      }
-      break;
-    case 't':
-      if (!memcmp(name, "system", 6)) {
-      /*                    ^        */
-        return -KEY_system; /* Weight 4326 */
-      }
-      if (!memcmp(name, "listen", 6)) {
-      /*                    ^        */
-        return -KEY_listen;
-      }
-      break;
-    case 'u':
-      if (!memcmp(name, "return", 6)) {
-      /*                    ^        */
-        return KEY_return; /* Weight 1401629 */
-      }
-      if (!memcmp(name, "values", 6)) {
-      /*                    ^        */
-        return -KEY_values; /* Weight 10110 */
-      }
-      break;
-    }
-    break;
-  case 7:
-    /* Names all of length 7.  */
-    /* DESTROY __END__ binmode connect dbmopen defined foreach getpgrp getppid
-       lcfirst opendir package readdir require reverse seekdir setpgrp shmread
-       sprintf symlink syscall sysopen sysread sysseek telldir ucfirst unshift
-       waitpid */
-    /* Offset 3 gives the best switch position.  */
-    switch (name[3]) {
-    case 'N':
-      if (!memcmp(name, "__END__", 7)) {
-      /*                    ^         */
-        return KEY___END__; /* Weight 112636 */
-      }
-      break;
-    case 'T':
-      if (!memcmp(name, "DESTROY", 7)) {
-      /*                    ^         */
-        return KEY_DESTROY; /* Weight 7 */
-      }
-      break;
-    case 'c':
-      if (!memcmp(name, "syscall", 7)) {
-      /*                    ^         */
-        return -KEY_syscall; /* Weight 560 */
-      }
-      break;
-    case 'd':
-      if (!memcmp(name, "readdir", 7)) {
-      /*                    ^         */
-        return -KEY_readdir; /* Weight 11716 */
-      }
-      break;
-    case 'e':
-      if (!memcmp(name, "foreach", 7)) {
-      /*                    ^         */
-        return KEY_foreach; /* Weight 281720 */
-      }
-      if (!memcmp(name, "reverse", 7)) {
-      /*                    ^         */
-        return -KEY_reverse; /* Weight 10571 */
-      }
-      break;
-    case 'h':
-      if (!memcmp(name, "unshift", 7)) {
-      /*                    ^         */
-        return -KEY_unshift; /* Weight 36504 */
-      }
-      break;
-    case 'i':
-      if (!memcmp(name, "defined", 7)) {
-      /*                    ^         */
-        return KEY_defined; /* Weight 694277 */
-      }
-      if (!memcmp(name, "sprintf", 7)) {
-      /*                    ^         */
-        return -KEY_sprintf; /* Weight 72704 */
-      }
-      if (!memcmp(name, "ucfirst", 7)) {
-      /*                    ^         */
-        return -KEY_ucfirst; /* Weight 1012 */
-      }
-      if (!memcmp(name, "lcfirst", 7)) {
-      /*                    ^         */
-        return -KEY_lcfirst; /* Weight 165 */
-      }
-      break;
-    case 'k':
-      if (!memcmp(name, "package", 7)) {
-      /*                    ^         */
-        return KEY_package; /* Weight 245661 */
-      }
-      if (!memcmp(name, "seekdir", 7)) {
-      /*                    ^         */
-        return -KEY_seekdir; /* Weight 20 */
-      }
-      break;
-    case 'l':
-      if (!memcmp(name, "symlink", 7)) {
-      /*                    ^         */
-        return -KEY_symlink; /* Weight 386 */
-      }
-      if (!memcmp(name, "telldir", 7)) {
-      /*                    ^         */
-        return -KEY_telldir; /* Weight 294 */
-      }
-      break;
-    case 'm':
-      if (!memcmp(name, "binmode", 7)) {
-      /*                    ^         */
-        return -KEY_binmode; /* Weight 12301 */
-      }
-      break;
-    case 'n':
-      if (!memcmp(name, "opendir", 7)) {
-      /*                    ^         */
-        return -KEY_opendir; /* Weight 9007 */
-      }
-      if (!memcmp(name, "connect", 7)) {
-      /*                    ^         */
-        return -KEY_connect; /* Weight 526 */
-      }
-      break;
-    case 'o':
-      if (!memcmp(name, "sysopen", 7)) {
-      /*                    ^         */
-        return -KEY_sysopen; /* Weight 1230 */
-      }
-      if (!memcmp(name, "dbmopen", 7)) {
-      /*                    ^         */
-        return -KEY_dbmopen;
-      }
-      break;
-    case 'p':
-      if (!memcmp(name, "getppid", 7)) {
-      /*                    ^         */
-        return -KEY_getppid; /* Weight 10 */
-      }
-      if (!memcmp(name, "getpgrp", 7)) {
-      /*                    ^         */
-        return -KEY_getpgrp;
-      }
-      if (!memcmp(name, "setpgrp", 7)) {
-      /*                    ^         */
-        return -KEY_setpgrp;
-      }
-      break;
-    case 'r':
-      if (!memcmp(name, "sysread", 7)) {
-      /*                    ^         */
-        return -KEY_sysread; /* Weight 3729 */
-      }
-      if (!memcmp(name, "shmread", 7)) {
-      /*                    ^         */
-        return -KEY_shmread;
-      }
-      break;
-    case 's':
-      if (!memcmp(name, "sysseek", 7)) {
-      /*                    ^         */
-        return -KEY_sysseek; /* Weight 721 */
-      }
-      break;
-    case 't':
-      if (!memcmp(name, "waitpid", 7)) {
-      /*                    ^         */
-        return -KEY_waitpid; /* Weight 414 */
-      }
-      break;
-    case 'u':
-      if (!memcmp(name, "require", 7)) {
-      /*                    ^         */
-        return KEY_require; /* Weight 375220 */
-      }
-      break;
-    }
-    break;
-  case 8:
-    /* Names all of length 8.  */
-    /* AUTOLOAD __DATA__ __FILE__ __LINE__ closedir continue dbmclose endgrent
-       endpwent formline getgrent getgrgid getgrnam getlogin getpwent getpwnam
-       getpwuid readline readlink readpipe setgrent setpwent shmwrite shutdown
-       syswrite truncate */
-    /* Offset 3 gives the best switch position.  */
-    switch (name[3]) {
-    case 'A':
-      if (!memcmp(name, "__DATA__", 8)) {
-      /*                    ^          */
-        return KEY___DATA__; /* Weight 395 */
-      }
-      break;
-    case 'I':
-      if (!memcmp(name, "__FILE__", 8)) {
-      /*                    ^          */
-        return -KEY___FILE__; /* Weight 888 */
-      }
-      if (!memcmp(name, "__LINE__", 8)) {
-      /*                    ^          */
-        return -KEY___LINE__; /* Weight 209 */
-      }
-      break;
-    case 'O':
-      if (!memcmp(name, "AUTOLOAD", 8)) {
-      /*                    ^          */
-        return KEY_AUTOLOAD; /* Weight 2713 */
-      }
-      break;
-    case 'c':
-      if (!memcmp(name, "dbmclose", 8)) {
-      /*                    ^          */
-        return -KEY_dbmclose;
-      }
-      break;
-    case 'd':
-      if (!memcmp(name, "readlink", 8)) {
-      /*                    ^          */
-        return -KEY_readlink; /* Weight 1537 */
-      }
-      if (!memcmp(name, "readline", 8)) {
-      /*                    ^          */
-        return -KEY_readline; /* Weight 19 */
-      }
-      if (!memcmp(name, "readpipe", 8)) {
-      /*                    ^          */
-        return -KEY_readpipe;
-      }
-      break;
-    case 'g':
-      if (!memcmp(name, "getgrgid", 8)) {
-      /*                    ^          */
-        return -KEY_getgrgid; /* Weight 67 */
-      }
-      if (!memcmp(name, "getgrnam", 8)) {
-      /*                    ^          */
-        return -KEY_getgrnam; /* Weight 11 */
-      }
-      if (!memcmp(name, "endgrent", 8)) {
-      /*                    ^          */
-        return -KEY_endgrent;
-      }
-      if (!memcmp(name, "getgrent", 8)) {
-      /*                    ^          */
-        return -KEY_getgrent;
-      }
-      if (!memcmp(name, "setgrent", 8)) {
-      /*                    ^          */
-        return -KEY_setgrent;
-      }
-      break;
-    case 'l':
-      if (!memcmp(name, "getlogin", 8)) {
-      /*                    ^          */
-        return -KEY_getlogin; /* Weight 158 */
-      }
-      break;
-    case 'm':
-      if (!memcmp(name, "formline", 8)) {
-      /*                    ^          */
-        return -KEY_formline; /* Weight 959 */
-      }
-      break;
-    case 'n':
-      if (!memcmp(name, "truncate", 8)) {
-      /*                    ^          */
-        return -KEY_truncate; /* Weight 1351 */
-      }
-      break;
-    case 'p':
-      if (!memcmp(name, "getpwuid", 8)) {
-      /*                    ^          */
-        return -KEY_getpwuid; /* Weight 681 */
-      }
-      if (!memcmp(name, "getpwnam", 8)) {
-      /*                    ^          */
-        return -KEY_getpwnam; /* Weight 483 */
-      }
-      if (!memcmp(name, "getpwent", 8)) {
-      /*                    ^          */
-        return -KEY_getpwent; /* Weight 12 */
-      }
-      if (!memcmp(name, "endpwent", 8)) {
-      /*                    ^          */
-        return -KEY_endpwent;
-      }
-      if (!memcmp(name, "setpwent", 8)) {
-      /*                    ^          */
-        return -KEY_setpwent;
-      }
-      break;
-    case 's':
-      if (!memcmp(name, "closedir", 8)) {
-      /*                    ^          */
-        return -KEY_closedir; /* Weight 11986 */
-      }
-      break;
-    case 't':
-      if (!memcmp(name, "continue", 8)) {
-      /*                    ^          */
-        return -KEY_continue; /* Weight 2925 */
-      }
-      if (!memcmp(name, "shutdown", 8)) {
-      /*                    ^          */
-        return -KEY_shutdown;
-      }
-      break;
-    case 'w':
-      if (!memcmp(name, "syswrite", 8)) {
-      /*                    ^          */
-        return -KEY_syswrite; /* Weight 4437 */
-      }
-      if (!memcmp(name, "shmwrite", 8)) {
-      /*                    ^          */
-        return -KEY_shmwrite;
-      }
-      break;
-    }
-    break;
-  case 9:
-    /* Names all of length 9.  */
-    /* endnetent getnetent localtime prototype quotemeta rewinddir setnetent
-       wantarray */
-    /* Offset 0 gives the best switch position.  */
-    switch (*name++) {
-    case 'e':
-      if (!memcmp(name, "ndnetent", 8)) {
-      /*                e              */
-        return -KEY_endnetent;
-      }
-      break;
-    case 'g':
-      if (!memcmp(name, "etnetent", 8)) {
-      /*                g              */
-        return -KEY_getnetent;
-      }
-      break;
-    case 'l':
-      if (!memcmp(name, "ocaltime", 8)) {
-      /*                l              */
-        return -KEY_localtime; /* Weight 7993 */
-      }
-      break;
-    case 'p':
-      if (!memcmp(name, "rototype", 8)) {
-      /*                p              */
-        return KEY_prototype; /* Weight 1602 */
-      }
-      break;
-    case 'q':
-      if (!memcmp(name, "uotemeta", 8)) {
-      /*                q              */
-        return -KEY_quotemeta; /* Weight 3120 */
-      }
-      break;
-    case 'r':
-      if (!memcmp(name, "ewinddir", 8)) {
-      /*                r              */
-        return -KEY_rewinddir; /* Weight 218 */
-      }
-      break;
-    case 's':
-      if (!memcmp(name, "etnetent", 8)) {
-      /*                s              */
-        return -KEY_setnetent; /* Weight 1 */
-      }
-      break;
-    case 'w':
-      if (!memcmp(name, "antarray", 8)) {
-      /*                w              */
-        return -KEY_wantarray; /* Weight 43024 */
-      }
-      break;
-    }
-    break;
-  case 10:
-    /* Names all of length 10.  */
-    /* endhostent endservent gethostent getservent getsockopt sethostent
-       setservent setsockopt socketpair */
-    /* Offset 6 gives the best switch position.  */
-    switch (name[6]) {
-    case 'k':
-      if (!memcmp(name, "setsockopt", 10)) {
-      /*                       ^          */
-        return -KEY_setsockopt; /* Weight 356 */
-      }
-      if (!memcmp(name, "getsockopt", 10)) {
-      /*                       ^          */
-        return -KEY_getsockopt; /* Weight 243 */
-      }
-      break;
-    case 'p':
-      if (!memcmp(name, "socketpair", 10)) {
-      /*                       ^          */
-        return -KEY_socketpair;
-      }
-      break;
-    case 't':
-      if (!memcmp(name, "gethostent", 10)) {
-      /*                       ^          */
-        return -KEY_gethostent; /* Weight 3 */
-      }
-      if (!memcmp(name, "endhostent", 10)) {
-      /*                       ^          */
-        return -KEY_endhostent;
-      }
-      if (!memcmp(name, "sethostent", 10)) {
-      /*                       ^          */
-        return -KEY_sethostent;
-      }
-      break;
-    case 'v':
-      if (!memcmp(name, "getservent", 10)) {
-      /*                       ^          */
-        return -KEY_getservent; /* Weight 4 */
-      }
-      if (!memcmp(name, "endservent", 10)) {
-      /*                       ^          */
-        return -KEY_endservent;
-      }
-      if (!memcmp(name, "setservent", 10)) {
-      /*                       ^          */
-        return -KEY_setservent;
-      }
-      break;
-    }
-    break;
-  case 11:
-    /* Names all of length 11.  */
-    /* __PACKAGE__ endprotoent getpeername getpriority getprotoent getsockname
-       setpriority setprotoent */
-    /* Offset 5 gives the best switch position.  */
-    switch (name[5]) {
-    case 'K':
-      if (!memcmp(name, "__PACKAGE__", 11)) {
-      /*                      ^            */
-        return -KEY___PACKAGE__; /* Weight 36767 */
-      }
-      break;
-    case 'c':
-      if (!memcmp(name, "getsockname", 11)) {
-      /*                      ^            */
-        return -KEY_getsockname; /* Weight 235 */
-      }
-      break;
-    case 'e':
-      if (!memcmp(name, "getpeername", 11)) {
-      /*                      ^            */
-        return -KEY_getpeername; /* Weight 713 */
-      }
-      break;
-    case 'i':
-      if (!memcmp(name, "getpriority", 11)) {
-      /*                      ^            */
-        return -KEY_getpriority; /* Weight 5 */
-      }
-      if (!memcmp(name, "setpriority", 11)) {
-      /*                      ^            */
-        return -KEY_setpriority; /* Weight 2 */
-      }
-      break;
-    case 'o':
-      if (!memcmp(name, "endprotoent", 11)) {
-      /*                      ^            */
-        return -KEY_endprotoent;
-      }
-      if (!memcmp(name, "getprotoent", 11)) {
-      /*                      ^            */
-        return -KEY_getprotoent;
-      }
-      if (!memcmp(name, "setprotoent", 11)) {
-      /*                      ^            */
-        return -KEY_setprotoent;
-      }
-      break;
-    }
-    break;
-  case 12:
-    /* Names all of length 12.  */
-    /* getnetbyaddr getnetbyname */
-    /* Offset 9 gives the best switch position.  */
-    switch (name[9]) {
-    case 'a':
-      if (!memcmp(name, "getnetbyname", 12)) {
-      /*                          ^         */
-        return -KEY_getnetbyname;
-      }
-      break;
-    case 'd':
-      if (!memcmp(name, "getnetbyaddr", 12)) {
-      /*                          ^         */
-        return -KEY_getnetbyaddr;
-      }
-      break;
-    }
-    break;
-  case 13:
-    /* Names all of length 13.  */
-    /* gethostbyaddr gethostbyname getservbyname getservbyport */
-    /* Offset 10 gives the best switch position.  */
-    switch (name[10]) {
-    case 'a':
-      if (!memcmp(name, "gethostbyname", 13)) {
-      /*                           ^         */
-        return -KEY_gethostbyname; /* Weight 970 */
+
+    case 7: /* 28 tokens of length 7 */
+      switch (name[0])
+      {
+        case 'D':
+          if (name[1] == 'E' &&
+              name[2] == 'S' &&
+              name[3] == 'T' &&
+              name[4] == 'R' &&
+              name[5] == 'O' &&
+              name[6] == 'Y')
+          {                                       /* DESTROY    */
+            return KEY_DESTROY;
+          }
+
+          goto unknown;
+
+        case '_':
+          if (name[1] == '_' &&
+              name[2] == 'E' &&
+              name[3] == 'N' &&
+              name[4] == 'D' &&
+              name[5] == '_' &&
+              name[6] == '_')
+          {                                       /* __END__    */
+            return KEY___END__;
+          }
+
+          goto unknown;
+
+        case 'b':
+          if (name[1] == 'i' &&
+              name[2] == 'n' &&
+              name[3] == 'm' &&
+              name[4] == 'o' &&
+              name[5] == 'd' &&
+              name[6] == 'e')
+          {                                       /* binmode    */
+            return -KEY_binmode;
+          }
+
+          goto unknown;
+
+        case 'c':
+          if (name[1] == 'o' &&
+              name[2] == 'n' &&
+              name[3] == 'n' &&
+              name[4] == 'e' &&
+              name[5] == 'c' &&
+              name[6] == 't')
+          {                                       /* connect    */
+            return -KEY_connect;
+          }
+
+          goto unknown;
+
+        case 'd':
+          switch (name[1])
+          {
+            case 'b':
+              if (name[2] == 'm' &&
+                  name[3] == 'o' &&
+                  name[4] == 'p' &&
+                  name[5] == 'e' &&
+                  name[6] == 'n')
+              {                                   /* dbmopen    */
+                return -KEY_dbmopen;
+              }
+
+              goto unknown;
+
+            case 'e':
+              if (name[2] == 'f' &&
+                  name[3] == 'i' &&
+                  name[4] == 'n' &&
+                  name[5] == 'e' &&
+                  name[6] == 'd')
+              {                                   /* defined    */
+                return KEY_defined;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'f':
+          if (name[1] == 'o' &&
+              name[2] == 'r' &&
+              name[3] == 'e' &&
+              name[4] == 'a' &&
+              name[5] == 'c' &&
+              name[6] == 'h')
+          {                                       /* foreach    */
+            return KEY_foreach;
+          }
+
+          goto unknown;
+
+        case 'g':
+          if (name[1] == 'e' &&
+              name[2] == 't' &&
+              name[3] == 'p')
+          {
+            switch (name[4])
+            {
+              case 'g':
+                if (name[5] == 'r' &&
+                    name[6] == 'p')
+                {                                 /* getpgrp    */
+                  return -KEY_getpgrp;
+                }
+
+                goto unknown;
+
+              case 'p':
+                if (name[5] == 'i' &&
+                    name[6] == 'd')
+                {                                 /* getppid    */
+                  return -KEY_getppid;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'l':
+          if (name[1] == 'c' &&
+              name[2] == 'f' &&
+              name[3] == 'i' &&
+              name[4] == 'r' &&
+              name[5] == 's' &&
+              name[6] == 't')
+          {                                       /* lcfirst    */
+            return -KEY_lcfirst;
+          }
+
+          goto unknown;
+
+        case 'o':
+          if (name[1] == 'p' &&
+              name[2] == 'e' &&
+              name[3] == 'n' &&
+              name[4] == 'd' &&
+              name[5] == 'i' &&
+              name[6] == 'r')
+          {                                       /* opendir    */
+            return -KEY_opendir;
+          }
+
+          goto unknown;
+
+        case 'p':
+          if (name[1] == 'a' &&
+              name[2] == 'c' &&
+              name[3] == 'k' &&
+              name[4] == 'a' &&
+              name[5] == 'g' &&
+              name[6] == 'e')
+          {                                       /* package    */
+            return KEY_package;
+          }
+
+          goto unknown;
+
+        case 'r':
+          if (name[1] == 'e')
+          {
+            switch (name[2])
+            {
+              case 'a':
+                if (name[3] == 'd' &&
+                    name[4] == 'd' &&
+                    name[5] == 'i' &&
+                    name[6] == 'r')
+                {                                 /* readdir    */
+                  return -KEY_readdir;
+                }
+
+                goto unknown;
+
+              case 'q':
+                if (name[3] == 'u' &&
+                    name[4] == 'i' &&
+                    name[5] == 'r' &&
+                    name[6] == 'e')
+                {                                 /* require    */
+                  return KEY_require;
+                }
+
+                goto unknown;
+
+              case 'v':
+                if (name[3] == 'e' &&
+                    name[4] == 'r' &&
+                    name[5] == 's' &&
+                    name[6] == 'e')
+                {                                 /* reverse    */
+                  return -KEY_reverse;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 's':
+          switch (name[1])
+          {
+            case 'e':
+              switch (name[2])
+              {
+                case 'e':
+                  if (name[3] == 'k' &&
+                      name[4] == 'd' &&
+                      name[5] == 'i' &&
+                      name[6] == 'r')
+                  {                               /* seekdir    */
+                    return -KEY_seekdir;
+                  }
+
+                  goto unknown;
+
+                case 't':
+                  if (name[3] == 'p' &&
+                      name[4] == 'g' &&
+                      name[5] == 'r' &&
+                      name[6] == 'p')
+                  {                               /* setpgrp    */
+                    return -KEY_setpgrp;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            case 'h':
+              if (name[2] == 'm' &&
+                  name[3] == 'r' &&
+                  name[4] == 'e' &&
+                  name[5] == 'a' &&
+                  name[6] == 'd')
+              {                                   /* shmread    */
+                return -KEY_shmread;
+              }
+
+              goto unknown;
+
+            case 'p':
+              if (name[2] == 'r' &&
+                  name[3] == 'i' &&
+                  name[4] == 'n' &&
+                  name[5] == 't' &&
+                  name[6] == 'f')
+              {                                   /* sprintf    */
+                return -KEY_sprintf;
+              }
+
+              goto unknown;
+
+            case 'y':
+              switch (name[2])
+              {
+                case 'm':
+                  if (name[3] == 'l' &&
+                      name[4] == 'i' &&
+                      name[5] == 'n' &&
+                      name[6] == 'k')
+                  {                               /* symlink    */
+                    return -KEY_symlink;
+                  }
+
+                  goto unknown;
+
+                case 's':
+                  switch (name[3])
+                  {
+                    case 'c':
+                      if (name[4] == 'a' &&
+                          name[5] == 'l' &&
+                          name[6] == 'l')
+                      {                           /* syscall    */
+                        return -KEY_syscall;
+                      }
+
+                      goto unknown;
+
+                    case 'o':
+                      if (name[4] == 'p' &&
+                          name[5] == 'e' &&
+                          name[6] == 'n')
+                      {                           /* sysopen    */
+                        return -KEY_sysopen;
+                      }
+
+                      goto unknown;
+
+                    case 'r':
+                      if (name[4] == 'e' &&
+                          name[5] == 'a' &&
+                          name[6] == 'd')
+                      {                           /* sysread    */
+                        return -KEY_sysread;
+                      }
+
+                      goto unknown;
+
+                    case 's':
+                      if (name[4] == 'e' &&
+                          name[5] == 'e' &&
+                          name[6] == 'k')
+                      {                           /* sysseek    */
+                        return -KEY_sysseek;
+                      }
+
+                      goto unknown;
+
+                    default:
+                      goto unknown;
+                  }
+
+                default:
+                  goto unknown;
+              }
+
+            default:
+              goto unknown;
+          }
+
+        case 't':
+          if (name[1] == 'e' &&
+              name[2] == 'l' &&
+              name[3] == 'l' &&
+              name[4] == 'd' &&
+              name[5] == 'i' &&
+              name[6] == 'r')
+          {                                       /* telldir    */
+            return -KEY_telldir;
+          }
+
+          goto unknown;
+
+        case 'u':
+          switch (name[1])
+          {
+            case 'c':
+              if (name[2] == 'f' &&
+                  name[3] == 'i' &&
+                  name[4] == 'r' &&
+                  name[5] == 's' &&
+                  name[6] == 't')
+              {                                   /* ucfirst    */
+                return -KEY_ucfirst;
+              }
+
+              goto unknown;
+
+            case 'n':
+              if (name[2] == 's' &&
+                  name[3] == 'h' &&
+                  name[4] == 'i' &&
+                  name[5] == 'f' &&
+                  name[6] == 't')
+              {                                   /* unshift    */
+                return -KEY_unshift;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'w':
+          if (name[1] == 'a' &&
+              name[2] == 'i' &&
+              name[3] == 't' &&
+              name[4] == 'p' &&
+              name[5] == 'i' &&
+              name[6] == 'd')
+          {                                       /* waitpid    */
+            return -KEY_waitpid;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
+      }
+
+    case 8: /* 26 tokens of length 8 */
+      switch (name[0])
+      {
+        case 'A':
+          if (name[1] == 'U' &&
+              name[2] == 'T' &&
+              name[3] == 'O' &&
+              name[4] == 'L' &&
+              name[5] == 'O' &&
+              name[6] == 'A' &&
+              name[7] == 'D')
+          {                                       /* AUTOLOAD   */
+            return KEY_AUTOLOAD;
+          }
+
+          goto unknown;
+
+        case '_':
+          if (name[1] == '_')
+          {
+            switch (name[2])
+            {
+              case 'D':
+                if (name[3] == 'A' &&
+                    name[4] == 'T' &&
+                    name[5] == 'A' &&
+                    name[6] == '_' &&
+                    name[7] == '_')
+                {                                 /* __DATA__   */
+                  return KEY___DATA__;
+                }
+
+                goto unknown;
+
+              case 'F':
+                if (name[3] == 'I' &&
+                    name[4] == 'L' &&
+                    name[5] == 'E' &&
+                    name[6] == '_' &&
+                    name[7] == '_')
+                {                                 /* __FILE__   */
+                  return -KEY___FILE__;
+                }
+
+                goto unknown;
+
+              case 'L':
+                if (name[3] == 'I' &&
+                    name[4] == 'N' &&
+                    name[5] == 'E' &&
+                    name[6] == '_' &&
+                    name[7] == '_')
+                {                                 /* __LINE__   */
+                  return -KEY___LINE__;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'c':
+          switch (name[1])
+          {
+            case 'l':
+              if (name[2] == 'o' &&
+                  name[3] == 's' &&
+                  name[4] == 'e' &&
+                  name[5] == 'd' &&
+                  name[6] == 'i' &&
+                  name[7] == 'r')
+              {                                   /* closedir   */
+                return -KEY_closedir;
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 'n' &&
+                  name[3] == 't' &&
+                  name[4] == 'i' &&
+                  name[5] == 'n' &&
+                  name[6] == 'u' &&
+                  name[7] == 'e')
+              {                                   /* continue   */
+                return -KEY_continue;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 'd':
+          if (name[1] == 'b' &&
+              name[2] == 'm' &&
+              name[3] == 'c' &&
+              name[4] == 'l' &&
+              name[5] == 'o' &&
+              name[6] == 's' &&
+              name[7] == 'e')
+          {                                       /* dbmclose   */
+            return -KEY_dbmclose;
+          }
+
+          goto unknown;
+
+        case 'e':
+          if (name[1] == 'n' &&
+              name[2] == 'd')
+          {
+            switch (name[3])
+            {
+              case 'g':
+                if (name[4] == 'r' &&
+                    name[5] == 'e' &&
+                    name[6] == 'n' &&
+                    name[7] == 't')
+                {                                 /* endgrent   */
+                  return -KEY_endgrent;
+                }
+
+                goto unknown;
+
+              case 'p':
+                if (name[4] == 'w' &&
+                    name[5] == 'e' &&
+                    name[6] == 'n' &&
+                    name[7] == 't')
+                {                                 /* endpwent   */
+                  return -KEY_endpwent;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'f':
+          if (name[1] == 'o' &&
+              name[2] == 'r' &&
+              name[3] == 'm' &&
+              name[4] == 'l' &&
+              name[5] == 'i' &&
+              name[6] == 'n' &&
+              name[7] == 'e')
+          {                                       /* formline   */
+            return -KEY_formline;
+          }
+
+          goto unknown;
+
+        case 'g':
+          if (name[1] == 'e' &&
+              name[2] == 't')
+          {
+            switch (name[3])
+            {
+              case 'g':
+                if (name[4] == 'r')
+                {
+                  switch (name[5])
+                  {
+                    case 'e':
+                      if (name[6] == 'n' &&
+                          name[7] == 't')
+                      {                           /* getgrent   */
+                        return -KEY_getgrent;
+                      }
+
+                      goto unknown;
+
+                    case 'g':
+                      if (name[6] == 'i' &&
+                          name[7] == 'd')
+                      {                           /* getgrgid   */
+                        return -KEY_getgrgid;
+                      }
+
+                      goto unknown;
+
+                    case 'n':
+                      if (name[6] == 'a' &&
+                          name[7] == 'm')
+                      {                           /* getgrnam   */
+                        return -KEY_getgrnam;
+                      }
+
+                      goto unknown;
+
+                    default:
+                      goto unknown;
+                  }
+                }
+
+                goto unknown;
+
+              case 'l':
+                if (name[4] == 'o' &&
+                    name[5] == 'g' &&
+                    name[6] == 'i' &&
+                    name[7] == 'n')
+                {                                 /* getlogin   */
+                  return -KEY_getlogin;
+                }
+
+                goto unknown;
+
+              case 'p':
+                if (name[4] == 'w')
+                {
+                  switch (name[5])
+                  {
+                    case 'e':
+                      if (name[6] == 'n' &&
+                          name[7] == 't')
+                      {                           /* getpwent   */
+                        return -KEY_getpwent;
+                      }
+
+                      goto unknown;
+
+                    case 'n':
+                      if (name[6] == 'a' &&
+                          name[7] == 'm')
+                      {                           /* getpwnam   */
+                        return -KEY_getpwnam;
+                      }
+
+                      goto unknown;
+
+                    case 'u':
+                      if (name[6] == 'i' &&
+                          name[7] == 'd')
+                      {                           /* getpwuid   */
+                        return -KEY_getpwuid;
+                      }
+
+                      goto unknown;
+
+                    default:
+                      goto unknown;
+                  }
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'r':
+          if (name[1] == 'e' &&
+              name[2] == 'a' &&
+              name[3] == 'd')
+          {
+            switch (name[4])
+            {
+              case 'l':
+                if (name[5] == 'i' &&
+                    name[6] == 'n')
+                {
+                  switch (name[7])
+                  {
+                    case 'e':
+                      {                           /* readline   */
+                        return -KEY_readline;
+                      }
+
+                      goto unknown;
+
+                    case 'k':
+                      {                           /* readlink   */
+                        return -KEY_readlink;
+                      }
+
+                      goto unknown;
+
+                    default:
+                      goto unknown;
+                  }
+                }
+
+                goto unknown;
+
+              case 'p':
+                if (name[5] == 'i' &&
+                    name[6] == 'p' &&
+                    name[7] == 'e')
+                {                                 /* readpipe   */
+                  return -KEY_readpipe;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 's':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 't')
+              {
+                switch (name[3])
+                {
+                  case 'g':
+                    if (name[4] == 'r' &&
+                        name[5] == 'e' &&
+                        name[6] == 'n' &&
+                        name[7] == 't')
+                    {                             /* setgrent   */
+                      return -KEY_setgrent;
+                    }
+
+                    goto unknown;
+
+                  case 'p':
+                    if (name[4] == 'w' &&
+                        name[5] == 'e' &&
+                        name[6] == 'n' &&
+                        name[7] == 't')
+                    {                             /* setpwent   */
+                      return -KEY_setpwent;
+                    }
+
+                    goto unknown;
+
+                  default:
+                    goto unknown;
+                }
+              }
+
+              goto unknown;
+
+            case 'h':
+              switch (name[2])
+              {
+                case 'm':
+                  if (name[3] == 'w' &&
+                      name[4] == 'r' &&
+                      name[5] == 'i' &&
+                      name[6] == 't' &&
+                      name[7] == 'e')
+                  {                               /* shmwrite   */
+                    return -KEY_shmwrite;
+                  }
+
+                  goto unknown;
+
+                case 'u':
+                  if (name[3] == 't' &&
+                      name[4] == 'd' &&
+                      name[5] == 'o' &&
+                      name[6] == 'w' &&
+                      name[7] == 'n')
+                  {                               /* shutdown   */
+                    return -KEY_shutdown;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+
+            case 'y':
+              if (name[2] == 's' &&
+                  name[3] == 'w' &&
+                  name[4] == 'r' &&
+                  name[5] == 'i' &&
+                  name[6] == 't' &&
+                  name[7] == 'e')
+              {                                   /* syswrite   */
+                return -KEY_syswrite;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        case 't':
+          if (name[1] == 'r' &&
+              name[2] == 'u' &&
+              name[3] == 'n' &&
+              name[4] == 'c' &&
+              name[5] == 'a' &&
+              name[6] == 't' &&
+              name[7] == 'e')
+          {                                       /* truncate   */
+            return -KEY_truncate;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
+      }
+
+    case 9: /* 8 tokens of length 9 */
+      switch (name[0])
+      {
+        case 'e':
+          if (name[1] == 'n' &&
+              name[2] == 'd' &&
+              name[3] == 'n' &&
+              name[4] == 'e' &&
+              name[5] == 't' &&
+              name[6] == 'e' &&
+              name[7] == 'n' &&
+              name[8] == 't')
+          {                                       /* endnetent  */
+            return -KEY_endnetent;
+          }
+
+          goto unknown;
+
+        case 'g':
+          if (name[1] == 'e' &&
+              name[2] == 't' &&
+              name[3] == 'n' &&
+              name[4] == 'e' &&
+              name[5] == 't' &&
+              name[6] == 'e' &&
+              name[7] == 'n' &&
+              name[8] == 't')
+          {                                       /* getnetent  */
+            return -KEY_getnetent;
+          }
+
+          goto unknown;
+
+        case 'l':
+          if (name[1] == 'o' &&
+              name[2] == 'c' &&
+              name[3] == 'a' &&
+              name[4] == 'l' &&
+              name[5] == 't' &&
+              name[6] == 'i' &&
+              name[7] == 'm' &&
+              name[8] == 'e')
+          {                                       /* localtime  */
+            return -KEY_localtime;
+          }
+
+          goto unknown;
+
+        case 'p':
+          if (name[1] == 'r' &&
+              name[2] == 'o' &&
+              name[3] == 't' &&
+              name[4] == 'o' &&
+              name[5] == 't' &&
+              name[6] == 'y' &&
+              name[7] == 'p' &&
+              name[8] == 'e')
+          {                                       /* prototype  */
+            return KEY_prototype;
+          }
+
+          goto unknown;
+
+        case 'q':
+          if (name[1] == 'u' &&
+              name[2] == 'o' &&
+              name[3] == 't' &&
+              name[4] == 'e' &&
+              name[5] == 'm' &&
+              name[6] == 'e' &&
+              name[7] == 't' &&
+              name[8] == 'a')
+          {                                       /* quotemeta  */
+            return -KEY_quotemeta;
+          }
+
+          goto unknown;
+
+        case 'r':
+          if (name[1] == 'e' &&
+              name[2] == 'w' &&
+              name[3] == 'i' &&
+              name[4] == 'n' &&
+              name[5] == 'd' &&
+              name[6] == 'd' &&
+              name[7] == 'i' &&
+              name[8] == 'r')
+          {                                       /* rewinddir  */
+            return -KEY_rewinddir;
+          }
+
+          goto unknown;
+
+        case 's':
+          if (name[1] == 'e' &&
+              name[2] == 't' &&
+              name[3] == 'n' &&
+              name[4] == 'e' &&
+              name[5] == 't' &&
+              name[6] == 'e' &&
+              name[7] == 'n' &&
+              name[8] == 't')
+          {                                       /* setnetent  */
+            return -KEY_setnetent;
+          }
+
+          goto unknown;
+
+        case 'w':
+          if (name[1] == 'a' &&
+              name[2] == 'n' &&
+              name[3] == 't' &&
+              name[4] == 'a' &&
+              name[5] == 'r' &&
+              name[6] == 'r' &&
+              name[7] == 'a' &&
+              name[8] == 'y')
+          {                                       /* wantarray  */
+            return -KEY_wantarray;
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
+      }
+
+    case 10: /* 9 tokens of length 10 */
+      switch (name[0])
+      {
+        case 'e':
+          if (name[1] == 'n' &&
+              name[2] == 'd')
+          {
+            switch (name[3])
+            {
+              case 'h':
+                if (name[4] == 'o' &&
+                    name[5] == 's' &&
+                    name[6] == 't' &&
+                    name[7] == 'e' &&
+                    name[8] == 'n' &&
+                    name[9] == 't')
+                {                                 /* endhostent */
+                  return -KEY_endhostent;
+                }
+
+                goto unknown;
+
+              case 's':
+                if (name[4] == 'e' &&
+                    name[5] == 'r' &&
+                    name[6] == 'v' &&
+                    name[7] == 'e' &&
+                    name[8] == 'n' &&
+                    name[9] == 't')
+                {                                 /* endservent */
+                  return -KEY_endservent;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 'g':
+          if (name[1] == 'e' &&
+              name[2] == 't')
+          {
+            switch (name[3])
+            {
+              case 'h':
+                if (name[4] == 'o' &&
+                    name[5] == 's' &&
+                    name[6] == 't' &&
+                    name[7] == 'e' &&
+                    name[8] == 'n' &&
+                    name[9] == 't')
+                {                                 /* gethostent */
+                  return -KEY_gethostent;
+                }
+
+                goto unknown;
+
+              case 's':
+                switch (name[4])
+                {
+                  case 'e':
+                    if (name[5] == 'r' &&
+                        name[6] == 'v' &&
+                        name[7] == 'e' &&
+                        name[8] == 'n' &&
+                        name[9] == 't')
+                    {                             /* getservent */
+                      return -KEY_getservent;
+                    }
+
+                    goto unknown;
+
+                  case 'o':
+                    if (name[5] == 'c' &&
+                        name[6] == 'k' &&
+                        name[7] == 'o' &&
+                        name[8] == 'p' &&
+                        name[9] == 't')
+                    {                             /* getsockopt */
+                      return -KEY_getsockopt;
+                    }
+
+                    goto unknown;
+
+                  default:
+                    goto unknown;
+                }
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 's':
+          switch (name[1])
+          {
+            case 'e':
+              if (name[2] == 't')
+              {
+                switch (name[3])
+                {
+                  case 'h':
+                    if (name[4] == 'o' &&
+                        name[5] == 's' &&
+                        name[6] == 't' &&
+                        name[7] == 'e' &&
+                        name[8] == 'n' &&
+                        name[9] == 't')
+                    {                             /* sethostent */
+                      return -KEY_sethostent;
+                    }
+
+                    goto unknown;
+
+                  case 's':
+                    switch (name[4])
+                    {
+                      case 'e':
+                        if (name[5] == 'r' &&
+                            name[6] == 'v' &&
+                            name[7] == 'e' &&
+                            name[8] == 'n' &&
+                            name[9] == 't')
+                        {                         /* setservent */
+                          return -KEY_setservent;
+                        }
+
+                        goto unknown;
+
+                      case 'o':
+                        if (name[5] == 'c' &&
+                            name[6] == 'k' &&
+                            name[7] == 'o' &&
+                            name[8] == 'p' &&
+                            name[9] == 't')
+                        {                         /* setsockopt */
+                          return -KEY_setsockopt;
+                        }
+
+                        goto unknown;
+
+                      default:
+                        goto unknown;
+                    }
+
+                  default:
+                    goto unknown;
+                }
+              }
+
+              goto unknown;
+
+            case 'o':
+              if (name[2] == 'c' &&
+                  name[3] == 'k' &&
+                  name[4] == 'e' &&
+                  name[5] == 't' &&
+                  name[6] == 'p' &&
+                  name[7] == 'a' &&
+                  name[8] == 'i' &&
+                  name[9] == 'r')
+              {                                   /* socketpair */
+                return -KEY_socketpair;
+              }
+
+              goto unknown;
+
+            default:
+              goto unknown;
+          }
+
+        default:
+          goto unknown;
       }
-      if (!memcmp(name, "getservbyname", 13)) {
-      /*                           ^         */
-        return -KEY_getservbyname; /* Weight 299 */
+
+    case 11: /* 8 tokens of length 11 */
+      switch (name[0])
+      {
+        case '_':
+          if (name[1] == '_' &&
+              name[2] == 'P' &&
+              name[3] == 'A' &&
+              name[4] == 'C' &&
+              name[5] == 'K' &&
+              name[6] == 'A' &&
+              name[7] == 'G' &&
+              name[8] == 'E' &&
+              name[9] == '_' &&
+              name[10] == '_')
+          {                                       /* __PACKAGE__ */
+            return -KEY___PACKAGE__;
+          }
+
+          goto unknown;
+
+        case 'e':
+          if (name[1] == 'n' &&
+              name[2] == 'd' &&
+              name[3] == 'p' &&
+              name[4] == 'r' &&
+              name[5] == 'o' &&
+              name[6] == 't' &&
+              name[7] == 'o' &&
+              name[8] == 'e' &&
+              name[9] == 'n' &&
+              name[10] == 't')
+          {                                       /* endprotoent */
+            return -KEY_endprotoent;
+          }
+
+          goto unknown;
+
+        case 'g':
+          if (name[1] == 'e' &&
+              name[2] == 't')
+          {
+            switch (name[3])
+            {
+              case 'p':
+                switch (name[4])
+                {
+                  case 'e':
+                    if (name[5] == 'e' &&
+                        name[6] == 'r' &&
+                        name[7] == 'n' &&
+                        name[8] == 'a' &&
+                        name[9] == 'm' &&
+                        name[10] == 'e')
+                    {                             /* getpeername */
+                      return -KEY_getpeername;
+                    }
+
+                    goto unknown;
+
+                  case 'r':
+                    switch (name[5])
+                    {
+                      case 'i':
+                        if (name[6] == 'o' &&
+                            name[7] == 'r' &&
+                            name[8] == 'i' &&
+                            name[9] == 't' &&
+                            name[10] == 'y')
+                        {                         /* getpriority */
+                          return -KEY_getpriority;
+                        }
+
+                        goto unknown;
+
+                      case 'o':
+                        if (name[6] == 't' &&
+                            name[7] == 'o' &&
+                            name[8] == 'e' &&
+                            name[9] == 'n' &&
+                            name[10] == 't')
+                        {                         /* getprotoent */
+                          return -KEY_getprotoent;
+                        }
+
+                        goto unknown;
+
+                      default:
+                        goto unknown;
+                    }
+
+                  default:
+                    goto unknown;
+                }
+
+              case 's':
+                if (name[4] == 'o' &&
+                    name[5] == 'c' &&
+                    name[6] == 'k' &&
+                    name[7] == 'n' &&
+                    name[8] == 'a' &&
+                    name[9] == 'm' &&
+                    name[10] == 'e')
+                {                                 /* getsockname */
+                  return -KEY_getsockname;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        case 's':
+          if (name[1] == 'e' &&
+              name[2] == 't' &&
+              name[3] == 'p' &&
+              name[4] == 'r')
+          {
+            switch (name[5])
+            {
+              case 'i':
+                if (name[6] == 'o' &&
+                    name[7] == 'r' &&
+                    name[8] == 'i' &&
+                    name[9] == 't' &&
+                    name[10] == 'y')
+                {                                 /* setpriority */
+                  return -KEY_setpriority;
+                }
+
+                goto unknown;
+
+              case 'o':
+                if (name[6] == 't' &&
+                    name[7] == 'o' &&
+                    name[8] == 'e' &&
+                    name[9] == 'n' &&
+                    name[10] == 't')
+                {                                 /* setprotoent */
+                  return -KEY_setprotoent;
+                }
+
+                goto unknown;
+
+              default:
+                goto unknown;
+            }
+          }
+
+          goto unknown;
+
+        default:
+          goto unknown;
       }
-      break;
-    case 'd':
-      if (!memcmp(name, "gethostbyaddr", 13)) {
-      /*                           ^         */
-        return -KEY_gethostbyaddr; /* Weight 68 */
+
+    case 12: /* 2 tokens of length 12 */
+      if (name[0] == 'g' &&
+          name[1] == 'e' &&
+          name[2] == 't' &&
+          name[3] == 'n' &&
+          name[4] == 'e' &&
+          name[5] == 't' &&
+          name[6] == 'b' &&
+          name[7] == 'y')
+      {
+        switch (name[8])
+        {
+          case 'a':
+            if (name[9] == 'd' &&
+                name[10] == 'd' &&
+                name[11] == 'r')
+            {                                     /* getnetbyaddr */
+              return -KEY_getnetbyaddr;
+            }
+
+            goto unknown;
+
+          case 'n':
+            if (name[9] == 'a' &&
+                name[10] == 'm' &&
+                name[11] == 'e')
+            {                                     /* getnetbyname */
+              return -KEY_getnetbyname;
+            }
+
+            goto unknown;
+
+          default:
+            goto unknown;
+        }
       }
-      break;
-    case 'o':
-      if (!memcmp(name, "getservbyport", 13)) {
-      /*                           ^         */
-        return -KEY_getservbyport;
+
+      goto unknown;
+
+    case 13: /* 4 tokens of length 13 */
+      if (name[0] == 'g' &&
+          name[1] == 'e' &&
+          name[2] == 't')
+      {
+        switch (name[3])
+        {
+          case 'h':
+            if (name[4] == 'o' &&
+                name[5] == 's' &&
+                name[6] == 't' &&
+                name[7] == 'b' &&
+                name[8] == 'y')
+            {
+              switch (name[9])
+              {
+                case 'a':
+                  if (name[10] == 'd' &&
+                      name[11] == 'd' &&
+                      name[12] == 'r')
+                  {                               /* gethostbyaddr */
+                    return -KEY_gethostbyaddr;
+                  }
+
+                  goto unknown;
+
+                case 'n':
+                  if (name[10] == 'a' &&
+                      name[11] == 'm' &&
+                      name[12] == 'e')
+                  {                               /* gethostbyname */
+                    return -KEY_gethostbyname;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+            }
+
+            goto unknown;
+
+          case 's':
+            if (name[4] == 'e' &&
+                name[5] == 'r' &&
+                name[6] == 'v' &&
+                name[7] == 'b' &&
+                name[8] == 'y')
+            {
+              switch (name[9])
+              {
+                case 'n':
+                  if (name[10] == 'a' &&
+                      name[11] == 'm' &&
+                      name[12] == 'e')
+                  {                               /* getservbyname */
+                    return -KEY_getservbyname;
+                  }
+
+                  goto unknown;
+
+                case 'p':
+                  if (name[10] == 'o' &&
+                      name[11] == 'r' &&
+                      name[12] == 't')
+                  {                               /* getservbyport */
+                    return -KEY_getservbyport;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
+            }
+
+            goto unknown;
+
+          default:
+            goto unknown;
+        }
       }
-      break;
-    }
-    break;
-  case 14:
-    if (!memcmp(name, "getprotobyname", 14)) {
-      return -KEY_getprotobyname; /* Weight 755 */
-    }
-    break;
-  case 16:
-    if (!memcmp(name, "getprotobynumber", 16)) {
-      return -KEY_getprotobynumber; /* Weight 232 */
-    }
-    break;
+
+      goto unknown;
+
+    case 14: /* 1 tokens of length 14 */
+      if (name[0] == 'g' &&
+          name[1] == 'e' &&
+          name[2] == 't' &&
+          name[3] == 'p' &&
+          name[4] == 'r' &&
+          name[5] == 'o' &&
+          name[6] == 't' &&
+          name[7] == 'o' &&
+          name[8] == 'b' &&
+          name[9] == 'y' &&
+          name[10] == 'n' &&
+          name[11] == 'a' &&
+          name[12] == 'm' &&
+          name[13] == 'e')
+      {                                           /* getprotobyname */
+        return -KEY_getprotobyname;
+      }
+
+      goto unknown;
+
+    case 16: /* 1 tokens of length 16 */
+      if (name[0] == 'g' &&
+          name[1] == 'e' &&
+          name[2] == 't' &&
+          name[3] == 'p' &&
+          name[4] == 'r' &&
+          name[5] == 'o' &&
+          name[6] == 't' &&
+          name[7] == 'o' &&
+          name[8] == 'b' &&
+          name[9] == 'y' &&
+          name[10] == 'n' &&
+          name[11] == 'u' &&
+          name[12] == 'm' &&
+          name[13] == 'b' &&
+          name[14] == 'e' &&
+          name[15] == 'r')
+      {                                           /* getprotobynumber */
+        return -KEY_getprotobynumber;
+      }
+
+      goto unknown;
+
+    default:
+      goto unknown;
   }
+
+unknown:
   return 0;
 }