This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Clarify \c in perlop.pod.
[perl5.git] / overload.pl
index 1bddd3f..d4ba9a7 100644 (file)
@@ -1,9 +1,18 @@
 #!/usr/bin/perl -w
-
 #
-# Generate overload.h
+# Regenerate (overwriting only if changed):
+#
+#    overload.h
+#    overload.c
+#    lib/overload/numbers.pm
+#
+# from information stored in the DATA section of this file.
+#
 # This allows the order of overloading constants to be changed.
-# 
+#
+# Accepts the standard regen_lib -q and -v args.
+#
+# This script is normally invoked from regen.pl.
 
 BEGIN {
     # Get function prototypes
@@ -12,6 +21,8 @@ BEGIN {
 
 use strict;
 
+use File::Spec::Functions qw(catdir catfile);;
+
 my (@enums, @names);
 while (<DATA>) {
   next if /^#/;
@@ -21,17 +32,58 @@ while (<DATA>) {
   push @names, $name;
 }
 
-safer_unlink 'overload.h';
-die "overload.h: $!" unless open(H, ">overload.h");
-binmode H;
-select H;
-print <<'EOF';
+safer_unlink (catfile(qw(lib overload numbers.pm)));
+my $c = safer_open("overload.c-new");
+my $h = safer_open("overload.h-new");
+mkdir("lib/overload") unless -d catdir(qw(lib overload));
+my $p = safer_open(catfile(qw(lib overload numbers.pm)));
+
+
+select $p;
+
+{
+local $" = "\n    ";
+print <<"EOF";
+# -*- buffer-read-only: t -*-
+#
+#   lib/overload/numbers.pm
+#
+#   Copyright (C) 2008 by Larry Wall and others
+#
+#   You may distribute under the terms of either the GNU General Public
+#   License or the Artistic License, as specified in the README file.
+#
+# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
+# This file is built by overload.pl
+#
+
+package overload::numbers;
+
+our \@names = qw#
+    @names
+#;
+
+our \@enums = qw#
+    @enums
+#;
+
+{ my \$i = 0; our %names = map { \$_ => \$i++ } \@names }
+
+{ my \$i = 0; our %enums = map { \$_ => \$i++ } \@enums }
+
+EOF
+}
+
+
+sub print_header {
+  my $file = shift;
+  print <<"EOF";
 /* -*- buffer-read-only: t -*-
  *
- *    overload.h
+ *    $file
  *
- *    Copyright (C) 1997, 1998, 2000, 2001, 2005 and 2006 by Larry Wall and
- *    others
+ *    Copyright (C) 1997, 1998, 2000, 2001, 2005, 2006, 2007 by Larry Wall
+ *    and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -39,6 +91,15 @@ print <<'EOF';
  *  !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
  *  This file is built by overload.pl
  */
+EOF
+}
+
+select $c;
+print_header('overload.c');
+
+select $h;
+print_header('overload.h');
+print <<'EOF';
 
 enum {
 EOF
@@ -50,31 +111,47 @@ print <<'EOF';
     /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
 };
 
-
 #define NofAMmeth max_amg_code
+
+EOF
+
+print $c <<'EOF';
+
 #define AMG_id2name(id) (PL_AMG_names[id]+1)
+#define AMG_id2namelen(id) (PL_AMG_namelens[id]-1)
+
+static const U8 PL_AMG_namelens[NofAMmeth] = {
+EOF
+
+my $last = pop @names;
+
+print $c "    $_,\n" foreach map { length $_ } @names;
 
-#ifdef DOINIT
-EXTCONST char * const PL_AMG_names[NofAMmeth] = {
+my $lastlen = length $last;
+print $c <<"EOT";
+    $lastlen
+};
+
+static const char * const PL_AMG_names[NofAMmeth] = {
   /* Names kept in the symbol table.  fallback => "()", the rest has
      "(" prepended.  The only other place in perl which knows about
      this convention is AMG_id2name (used for debugging output and
      'nomethod' only), the only other place which has it hardwired is
      overload.pm.  */
-EOF
+EOT
 
-my $last = pop @names;
-print "    \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names;
+print $c "    \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names;
 
-print <<"EOT";
+print $c <<"EOT";
     "$last"
 };
-#else
-EXTCONST char * PL_AMG_names[NofAMmeth];
-#endif /* def INITAMAGIC */
 EOT
 
-close H or die $!;
+safer_close($h);
+safer_close($c);
+safer_close($p);
+rename_if_different("overload.c-new", "overload.c");
+rename_if_different("overload.h-new","overload.h");
 
 __DATA__
 # Fallback should be the first
@@ -151,5 +228,7 @@ repeat_ass  (x=
 concat         (.
 concat_ass     (.=
 smart          (~~
+ftest           (-X
+regexp          (qr
 # Note: Perl_Gv_AMupdate() assumes that DESTROY is the last entry
 DESTROY                DESTROY