This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
integrate changes#7069..7077,7079,7081..7087,7090,7092,7093,
authorGurusamy Sarathy <gsar@cpan.org>
Sun, 17 Dec 2000 22:49:13 +0000 (22:49 +0000)
committerGurusamy Sarathy <gsar@cpan.org>
Sun, 17 Dec 2000 22:49:13 +0000 (22:49 +0000)
7096..7104,7109..7117,7119..7124,7126,7128,7129,7133,7134,
7136..7139,7141..7146,7148,7149,7151,7153..7155,7157,7158,
7160,7161,7164,7165,7169..7178,7180..7191,7193..7197,7199,
7201,7204 from mainline

Remove vestiges of tr//CU.
Subject: [ID 20000912.009] perlunicode.pod still mentions tr///CU
Subject: Re: [ID 20000912.009] perlunicode.pod still mentions tr///CU

The return value of setlocale must be copied away.
Subject: [ID 20000913.001] Heap corruption in Perl_init_i18nl10n

Allow chop() and chomp() to be overridden.
Subject: [PATCH] Re: [ID 20000911.006] I can override glob but not chop?

Hints optimization.
Subject: Minor nit

Subject: [PATCH] de-wall t/README

Subject: Re: Two advertising clauses need to be removed

Batch of UTF-8 patches from Simon Cozens.

Fix for a parsing bug, not for the original bug.
Subject: Re: [ID 20000910.005] Another segfault with regexes.

Compilation warnings and an error.

Subject: File::Find 5.7.0 POD nits

Subject: [PATCH perl-5.7.0] continued -Wformat support

The one that got away.

Subject: Re: perl@7078

UTF8-encoded version of 256 is 0xc4 0x80; test that a char is
convertable to bytes by checking it doesn't go above 0xc3
Subject: Re: perl@7078

Replace #7084 with
Subject: Re: perl@7078

We don't need to count the high bit bytes, a boolean is enough.

Subject: [PATCH] utf8.c apidoc

Subject: Re: perl@7078

Botched the #7090 check-in.

Fix for the charnames.t failures from Spider Boardman.

Re-instate Perl_utf8_to_uv without checking parameter - added in change 7075.
i.e. rename Simon's function to Perl_utf8_to_uv_chk, change all calls to it
to use new name and add Perl_utf8_to_uv() as a wrapper which calls it passing
0 to checking to get the warning.

Subject: [PATCH] Nits in perlmod.pod

Subject: Re: Trapping by opmask sets strange parser state [PATCH]

Subject: Re: unicode support and perl [ID 20000901.097]

Subject: Re: unicode support and perl [ID 20000901.097]

Subject: [PATCH perl@7065] another VMS my_fwrite() fix for Storable

Subject: [PATCH] Re: [ID 20000915.010] Infinite loop with -MO=Deparse

Subject: [ID 20000917.002] 5.7.0 and blead@7095 make html makes man

Subject: [PATCH@blead] Fix some recursion in overload.pm

s/Robin Parker/Robin Barker/

Subject: [PATCH] Fix aliasing of tied filehandles

Subject: Re: [ID 20000912.008] substr replacement of tainted data (bug)

Subject: Re: [PATCH 5.005_64 missed]

SOCK_DGRAM and listen() do not mix as reported in
Subject: [ID 20000930.001] Bug in perl 5.00503 IO::Socket
The patch for 5.7.0+ had to be reengineered, though.

Subject: DOC PATCH 5.6.0

Subject: [PATCH 5.7.0] Minor optimization in re_intuit_start

Document the issue (is not a syntax error, kind of)
Subject: Re: [ID 20000901.011] the list (1,,3) ought to be a syntax error

Subject: [ID 20000928.002] perlcc & ByteCode.pm option mismatch
Did not apply cleanly, manual intervention was needed.

Subject: [PATCH] DLL not restartabke with threaded perl

Inside require() $^S was always left undefined.
Subject: Re: Tiny 2-byte change to fix debugger's eval bug

Subject: [PATCH pod/perlop.pod]  Documentation glitch in magic autoincrement.

OpenBSD flags tweak from Todd C. Miller, tweaked some more by Abigail.

Regen headers.

Subject: [PATCH 5.7.0] Epoc update

Introduce NO_ENVIRON_ARRAY (and USE_ENVIRON_ARRAY) defines
as suggested by Olaf Flebbe and Nicholas Clark.

Subject: [ID 20000915.007] Not OK: perl v5.7.0 +DEVEL7092 on os2-64int-ld 2.30 '(UNINSTALLED)'

Misplaced else.

Scale down the VMS message boxes, by Charles Lane.
Fix for ID 20000903.009, workaround at
http://www.xray.mpe.mpg.de/mailing-lists/vmsperl/2000-09/msg00039.html

Subject: [ID 20001003.006] B::Debug not -w clean

Test harness update to sync with the new perlcc,
from Simon Cozens.

One remaining nit less at the VMS mailbox sizing.

Subject: [PATCH: 7131] PWPASSWD problem for passwd less pwd's

It is possible to have no hosts database at all.  Pointed out in
Subject: [PATCH: 7131] PWPASSWD problem for passwd less pwd's

Subject: [PATCH 5.7.0] h2xs not working
Subject: [PATCH 5.7.0] h2xs not documenting the created module

Subject:  [PATCH] 5.6.0 & 5.7.0  VMS TZ fix for VMS6.2 and earlier

Subject: perlhack.pod Patch for Externals Tools

Subject: [PATCH perlrun.pod] Re: [ID 20000930.002] perlrun nor perldelta mention -s modification

Subject: Re: [PATCH 5.7.0] h2xs not documenting the created module

Enable disabling scripts installation by Configure -Uinstallscripts,
suggested by H. Merijn Brand.

Code around the stat-on-a-pipe-returns-a-mode-of-zero bug
reported several times by Dominic Dunlop, for example in
ID 20000315.008.  Patch from Dominic.  Patch affects at
least MachTen, and possibly other oldish BSDs. Should not
break non-broken platforms (tested on LinuxPPC).

Regen toc.

Subject: Re: Questions about Tie::Array and perl modules
Bug reported and fix suggested by Philip D Crow <pcrow@hertz.com>.

Patch from Simon Cozens to avoid using utf8 routines in EBCDIC.

Tweak #7153.

IO::Handle->syswrite() did not handle length omission
like CORE::syswrite() does.
Subject: [Fwd] IO::Handle, syswrite and arguments
The original patch from andrew@ugh.net.au.

Also the $ccflags is needed for the C compiler check.
Subject: Configure (check for C-compiler)

Eliminate $Is_VMS code from the test.
Subject:  Re: [ID 20001004.005] Not OK: perl v5.7.0 +DEVEL7129 on VMS_AXP V7.1

Fix bug in #7157 (s/cflags/ccflags); moved the -o foo
as the first option of cc/ld because of ultrapicky compilers
(e.g. OS/390 R2.5)

Change the version number of Tie::Handle in the core to 4.0,
the (unrelated) Tie::Handle in CPAN will remain at 3.0.
Subject: Note on Tie::Handle

UTF8ize split() so that the cloned substrings get the UTF8
flag of the original scalar.  Problem reported by Simon Cozens.

save_re_context() could reset PL_curcop to freed memory, causing core
dumps in code such as C<use CGI::Carp; use something_that_calls_die;>

Subject: PATCH 5.6 perldebguts grammar cleanup

Add a todo note about overloadable assertions.

on Windows, LoadLibrary() could load an extension DLL multiple
times if forward slashes are used in the path

on Windows, cwd strings in the environment should be of the
form =X:=X:\foo instead of =X=X:\foo\

on Windows, avoid potential exception (could happen if MSVCRT isn't
being used) when closing a socket handle

avoid nonportable example code

Windows9x doesn't support link(), despite what Config.pm
might think

pod nit

Change #7160 had a nasty typo.

Warn about unknown scripts.
Subject: Re: ideas? patches? [PATCH bleadperl]

on Windows, clean targets might not work under some flavors of the shell

tweak for change#7173

Make eq work again with utf8 (disabling the upgrading
should no more be necessary since the copies of the
scalars are upgraded, not the scalars themselves).
Takes care of ID 20001009.001.  (The claimed length()
bug in 20001009.001 seems bogus to me.)

Subject: [PATCH: perl@7159] various VMS cleanup issues + CXX configure

Upgrade to CGI.pm 2.74, from Lincoln Stein.

Upgrade to podlators 1.04, from Russ Allbery.

Subject: [PATCH 5.6.0] Re: [ID 20001009.004] SEGV from sprintf in a thread

Quote the temp file name, needed in Win32 because the
default name unfortunately contains spaces, shouldn't
hurt elsewhere.
Subject: FW: perldoc fails if $TEMP contains spaces

Subject: RE: [ID 19990803.001] README.win32 suggestions

Subject: [ID 20000720.004] ExtUtils::MakeMaker finds wrong version of perl

Subject: Re: utf8 concat, mg_get

Subject: [PATCH: perl@7181] perlebcdic.pod updates and corrections

Subject: [PATCH: perl@7181] op/tr tests on OS/390

Subject: [PATCH: perl@7181] ver.t v string tests for os/390

Use the versiononly instead of the installscripts,
retract the changes 7146 and 7147.

Reapply Andy's patch and regen Configure.

Add the test case for #7190, from the original bug report
by Andreas K├Ânig.

Remove duplicated code.

SvPV() (via mg_get() of sv_2pv()) can update the UTF8ness of the SVs.

restore change#7202

p4raw-link: @7202 on //depot/perl: c3fbb29af1dd039d12fa65f0dc334e804a3883fc
p4raw-link: @7173 on //depot/perl: a10b7b7eee64efea010bfdba91243503341ba68d
p4raw-link: @7087 on //depot/perl: b6b716fe3a82a1de9cf94c1d43c790a87a9ece17
p4raw-link: @7081 on //depot/perl: d2560b705d852dbc96fd94b95faaa076758b7a8c
p4raw-link: @7079 on //depot/perl: f10e15646b76a57d224bd131f4c70a7a72147171
p4raw-link: @7077 on //depot/perl: 00df9076cdf35146bc1b44c688065deb7ae6b3ae
p4raw-link: @7069 on //depot/perl: 383e7cdd17eec132ddb7b17dd6275f3153cbe989

p4raw-id: //depot/maint-5.6/perl@8156
p4raw-integrated: from //depot/perl@8153 'copy in' epoc/epoc_stubs.c
epoc/link.pl (@4782..) ext/IO/lib/IO/Socket/UNIX.pm (@4860..)
lib/File/Copy.pm (@5349..) ext/DynaLoader/dl_dlopen.xs
(@5384..) util.h (@6347..) epoc/createpkg.pl (@6363..) pp.sym
pp_proto.h (@6434..) lib/AutoLoader.pm (@6456..)
pod/perldata.pod (@6548..) ext/B/B/Bytecode.pm (@6763..)
ext/ByteLoader/bytecode.h (@6859..) hints/os2.sh (@6873..)
t/lib/cgi-form.t t/op/substr.t t/op/tiehandle.t t/pragma/subs.t
(@6874..) opcode.h (@7016..) lib/Tie/Handle.pm (@7022..)
Todo-5.6 (@7068..) epoc/epocish.h (@7124..) vms/vmsish.h
(@7126..)
p4raw-integrated: from //depot/perl@7204 'edit in' mg.c (@7203..)
p4raw-integrated: from //depot/perl@7201 'copy in' t/pragma/utf8.t
(@7197..) 'edit in' pp_hot.c (@7200..)
p4raw-integrated: from //depot/perl@7199 'copy in' t/lib/cgi-html.t
(@7184..)
p4raw-integrated: from //depot/perl@7196 'copy in' INSTALL
Porting/Glossary Porting/config.sh epoc/config.sh installperl
vos/config.def win32/config.bc win32/config.gc win32/config.vc
(@7195..) 'edit in' Configure Makefile.SH (@7195..) 'ignore'
config_h.SH (@7195..)
p4raw-integrated: from //depot/perl@7195 'copy in' Porting/config_H
(@7146..)
p4raw-integrated: from //depot/perl@7194 'copy in' t/op/ver.t (@6874..)
p4raw-integrated: from //depot/perl@7193 'merge in' t/op/tr.t (@6874..)
p4raw-integrated: from //depot/perl@7191 'copy in' pod/perlebcdic.pod
(@7001..)
p4raw-integrated: from //depot/perl@7189 'copy in'
lib/ExtUtils/MM_Unix.pm (@7054..)
p4raw-integrated: from //depot/perl@7188 'copy in' README.win32
(@6021..)
p4raw-integrated: from //depot/perl@7187 'copy in' utils/perldoc.PL
(@6887..)
p4raw-integrated: from //depot/perl@7186 'copy in' t/lib/thr5005.t
(@6874..) 'edit in' util.c (@7126..)
p4raw-integrated: from //depot/perl@7185 'copy in' lib/Pod/Man.pm
lib/Pod/Text.pm (@7047..)
p4raw-integrated: from //depot/perl@7184 'copy in' lib/CGI.pm (@6722..)
p4raw-integrated: from //depot/perl@7183 'copy in' configure.com
vms/descrip_mms.template (@7058..) vms/vms.c (@7142..)
p4raw-integrated: from //depot/perl@7182 'edit in' sv.c (@7163..)
p4raw-integrated: from //depot/perl@7181 'copy in' win32/win32sck.c
(@7173..)
p4raw-integrated: from //depot/perl@7180 'merge in' win32/Makefile
win32/makefile.mk (@6737..)
p4raw-integrated: from //depot/perl@7178 'copy in' lib/charnames.pm
(@5821..)
p4raw-integrated: from //depot/perl@7176 'copy in' pod/perlport.pod
(@6917..)
p4raw-integrated: from //depot/perl@7175 'copy in'
lib/ExtUtils/Manifest.pm (@4954..)
p4raw-integrated: from //depot/perl@7173 'copy in' win32/win32.h
(@6939..) win32/win32.c (@7171..)
p4raw-integrated: from //depot/perl@7172 'copy in' win32/vdir.h
(@6318..)
p4raw-integrated: from //depot/perl@7169 'copy in' pod/perldebguts.pod
(@7114..)
p4raw-integrated: from //depot/perl@7165 'edit in' pp_ctl.c (@7156..)
p4raw-integrated: from //depot/perl@7164 'edit in' pp.c (@7096..)
p4raw-integrated: from //depot/perl@7158 'copy in' t/lib/b.t (@6874..)
p4raw-integrated: from //depot/perl@7155 'copy in'
ext/IO/lib/IO/Handle.pm (@6553..)
p4raw-integrated: from //depot/perl@7154 'copy in' utf8.h (@7153..)
p4raw-integrated: from //depot/perl@7151 'copy in' lib/Tie/Array.pm
(@5507..) t/op/array.t (@5989..)
p4raw-integrated: from //depot/perl@7149 'copy in' pod/perltoc.pod
(@7001..)
p4raw-integrated: from //depot/perl@7148 'copy in' doio.c (@6532..)
p4raw-integrated: from //depot/perl@7145 'copy in' utils/h2xs.PL
(@7141..)
p4raw-integrated: from //depot/perl@7144 'copy in' pod/perlrun.pod
(@6547..)
p4raw-integrated: from //depot/perl@7143 'copy in' pod/perlhack.pod
(@6922..)
p4raw-integrated: from //depot/perl@7138 'edit in' pp_sys.c (@7124..)
p4raw-integrated: from //depot/perl@7136 'copy in' t/UTEST (@4092..)
t/TEST (@7064..)
p4raw-integrated: from //depot/perl@7134 'copy in' ext/B/B/Debug.pm
(@4546..)
p4raw-integrated: from //depot/perl@7128 'copy in' os2/os2ish.h
(@6915..)
p4raw-integrated: from //depot/perl@7126 'edit in' perl.h (@7124..)
'merge in' unixish.h (@6343..)
p4raw-integrated: from //depot/perl@7124 'copy in' epoc/epoc.c
(@4782..) README.epoc (@6363..) lib/Cwd.pm (@6862..) 'edit in'
perl.c (@7119..)
p4raw-integrated: from //depot/perl@7123 'edit in' embed.h
pod/perlapi.pod (@7096..)
p4raw-integrated: from //depot/perl@7122 'copy in' hints/openbsd.sh
(@5868..)
p4raw-integrated: from //depot/perl@7121 'copy in' pod/perlop.pod
(@7027..)
p4raw-integrated: from //depot/perl@7120 'copy in' cop.h (@6909..)
p4raw-integrated: from //depot/perl@7117 'copy in' utils/perlcc.PL
(@6523..)
p4raw-integrated: from //depot/perl@7115 'copy in' regexec.c (@7096..)
p4raw-integrated: from //depot/perl@7112 'copy in' pod/perlxs.pod
(@7061..)
p4raw-integrated: from //depot/perl@7111 'copy in' opcode.pl (@6553..)
'edit in' op.c (@7096..)
p4raw-integrated: from //depot/perl@7109 'merge in' Changes5.6
(@5903..)
p4raw-integrated: from //depot/perl@7104 'copy in' lib/overload.pm
(@7012..) 'merge in' t/pragma/overload.t (@6983..)
p4raw-integrated: from //depot/perl@7103 'merge in' pod/Makefile.SH
(@6714..)
p4raw-integrated: from //depot/perl@7102 'copy in' ext/B/B/Deparse.pm
(@6880..)
p4raw-integrated: from //depot/perl@7100 'copy in' t/op/append.t
(@6719..)
p4raw-integrated: from //depot/perl@7098 'edit in' toke.c (@7096..)
p4raw-integrated: from //depot/perl@7097 'copy in' pod/perlmod.pod
(@6007..)
p4raw-integrated: from //depot/perl@7096 'copy in' handy.h (@7075..)
regcomp.c (@7081..) 'edit in' doop.c (@7075..) perlapi.c utf8.c
(@7087..) embed.pl proto.h (@7091..) 'merge in' global.sym
objXSUB.h (@7016..)
p4raw-integrated: from //depot/perl@7083 'copy in' t/op/bop.t (@6874..)
p4raw-integrated: from //depot/perl@7082 'copy in' lib/File/Find.pm
(@7079..)
p4raw-integrated: from //depot/perl@7081 'copy in' Porting/pumpkin.pod
(@5084..) malloc.c (@5651..) ext/Devel/Peek/Peek.xs (@5716..)
universal.c (@5924..)

121 files changed:
Changes
Configure
INSTALL
Makefile.SH
Porting/Glossary
Porting/config.sh
Porting/config_H
Porting/pumpkin.pod
README.epoc
README.win32
Todo-5.6
config_h.SH
configure.com
cop.h
doio.c
doop.c
embed.h
embed.pl
epoc/config.sh
epoc/createpkg.pl
epoc/epoc.c
epoc/epoc_stubs.c
epoc/epocish.h
epoc/link.pl
ext/B/B/Bytecode.pm
ext/B/B/Debug.pm
ext/B/B/Deparse.pm
ext/ByteLoader/bytecode.h
ext/Devel/Peek/Peek.xs
ext/DynaLoader/dl_dlopen.xs
ext/IO/lib/IO/Handle.pm
ext/IO/lib/IO/Socket/UNIX.pm
global.sym
handy.h
hints/openbsd.sh
hints/os2.sh
installperl
lib/AutoLoader.pm
lib/CGI.pm
lib/Cwd.pm
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/Manifest.pm
lib/File/Copy.pm
lib/File/Find.pm
lib/Pod/Man.pm
lib/Pod/Text.pm
lib/Tie/Array.pm
lib/Tie/Handle.pm
lib/charnames.pm
lib/overload.pm
malloc.c
mg.c
objXSUB.h
op.c
opcode.h
opcode.pl
os2/os2ish.h
perl.c
perl.h
perlapi.c
pod/Makefile.SH
pod/perlapi.pod
pod/perldata.pod
pod/perldebguts.pod
pod/perlebcdic.pod
pod/perlhack.pod
pod/perlmod.pod
pod/perlop.pod
pod/perlport.pod
pod/perlrun.pod
pod/perltoc.pod
pod/perlxs.pod
pp.c
pp.sym
pp_ctl.c
pp_hot.c
pp_proto.h
pp_sys.c
proto.h
regcomp.c
regexec.c
sv.c
t/TEST
t/UTEST
t/lib/b.t
t/lib/cgi-form.t
t/lib/cgi-html.t
t/lib/thr5005.t
t/op/append.t
t/op/array.t
t/op/bop.t
t/op/substr.t
t/op/tiehandle.t
t/op/tr.t
t/op/ver.t
t/pragma/overload.t
t/pragma/subs.t
t/pragma/utf8.t
toke.c
universal.c
unixish.h
utf8.c
utf8.h
util.c
util.h
utils/h2xs.PL
utils/perlcc.PL
utils/perldoc.PL
vms/descrip_mms.template
vms/vms.c
vms/vmsish.h
vos/config.def
win32/Makefile
win32/config.bc
win32/config.gc
win32/config.vc
win32/makefile.mk
win32/vdir.h
win32/win32.c
win32/win32.h
win32/win32sck.c

diff --git a/Changes b/Changes
index 250de59..ed7c4e1 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3552,7 +3552,7 @@ ____________________________________________________________________________
 ____________________________________________________________________________
 [  5802] By: jhi                                   on 2000/03/18  17:11:07
         Log: Configure nits: rewording from Sarathy (aka #5796),
-             and installation directories patch from Robin Parker.
+             and installation directories patch from Robin Barker.
      Branch: cfgperl
           ! Configure Porting/Glossary Porting/config.sh Porting/config_H
           ! config_h.SH vos/config.h vos/config_h.SH_orig
@@ -5729,7 +5729,7 @@ ____________________________________________________________________________
 ____________________________________________________________________________
 [  5440] By: jhi                                   on 2000/03/02  17:48:15
         Log: Confusion over uselargefiles.cbu and uselfs.cbu (the first one
-             is the correct one), spotted by Robin Parker.
+             is the correct one), spotted by Robin Barker.
      Branch: cfgperl
           ! Configure config_h.SH hints/aix.sh hints/hpux.sh
      Branch: metaconfig/U/perl
@@ -15253,7 +15253,7 @@ ____________________________________________________________________________
 ____________________________________________________________________________
 [  4045] By: jhi                                   on 1999/08/29  15:18:38
         Log: Fix scalar gmtime (and localtime) in quad environments,
-             bug reported by Robin Parker.
+             bug reported by Robin Barker.
              
              From: Robin Barker <rmb1@cise.npl.co.uk>
              To: jhi@iki.fi
index c4f8d1c..0961c33 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,7 +20,7 @@
 
 # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
 #
-# Generated on Tue Sep 12 17:23:02 EET DST 2000 [metaconfig 3.0 PL70]
+# Generated on Wed Oct 11 00:32:36 EET DST 2000 [metaconfig 3.0 PL70]
 # (with additional metaconfig patches by perlbug@perl.org)
 
 cat >/tmp/c1$$ <<EOF
@@ -944,6 +944,7 @@ vendorlibexp=''
 usevendorprefix=''
 vendorprefix=''
 vendorprefixexp=''
+versiononly=''
 defvoidused=''
 voidflags=''
 pm_apiversion=''
@@ -2098,7 +2099,7 @@ int main(int argc, char *argv[]) {
   return 0;
 }
 EOM
-    if $cc -o try try.c; then
+    if $cc -o try $ccflags try.c; then
        :
     else
         echo "Uh-oh, the C compiler '$cc' doesn't seem to be working." >&4
@@ -2132,8 +2133,12 @@ EOM
             fi
         fi
         if $test X"$despair" = Xyes; then
-            echo "You need to find a working C compiler." >&4
-            echo "I cannot continue any further, aborting." >&4
+           $cat >&4 <<EOM
+You need to find a working C compiler.
+Either (purchase and) install the C compiler supplied by your OS vendor,
+or for a free C compiler try http://gcc.gnu.org/
+I cannot continue any further, aborting.
+EOM
             exit 1
         fi
     fi
@@ -3004,7 +3009,7 @@ int main() {
        exit(0);
 }
 EOM
-if $cc $ldflags -o gccvers gccvers.c; then
+if $cc -o gccvers $ldflags gccvers.c; then
        gccversion=`./gccvers`
        case "$gccversion" in
        '') echo "You are not using GNU cc." ;;
@@ -4012,7 +4017,7 @@ $cat > try.c <<'EOF'
 #include <stdio.h>
 int main() { printf("Ok\n"); exit(0); }
 EOF
-set X $cc $optimize $ccflags -o try $ldflags try.c $libs
+set X $cc -o try $optimize $ccflags $ldflags try.c $libs
 shift
 $cat >try.msg <<'EOM'
 I've tried to compile and run the following simple program:
@@ -4031,7 +4036,7 @@ and I got the following output:
 
 EOM
 dflt=y
-if sh -c "$cc $optimize $ccflags -o try $ldflags try.c $libs" >>try.msg 2>&1; then
+if sh -c "$cc -o try $optimize $ccflags $ldflags try.c $libs" >>try.msg 2>&1; then
        if sh -c './try' >>try.msg 2>&1; then
                xxx=`./try`
                case "$xxx" in
@@ -4143,12 +4148,12 @@ esac'
 compile='
 mc_file=$1;
 shift;
-$cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs > /dev/null 2>&1;'
+$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs > /dev/null 2>&1;'
 : define a shorthand compile call for compilations that should be ok.
 compile_ok='
 mc_file=$1;
 shift;
-$cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs;'
+$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs;'
 
 : check for lengths of integral types
 echo " "
@@ -4970,7 +4975,7 @@ yes)
                fi;;
        *)
                echo "int main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }" > t.c;
-               if $cc $optimize $ccflags $ldflags -o t t.c $libs >/dev/null 2>&1;
+               if $cc -o t $optimize $ccflags $ldflags t.c $libs >/dev/null 2>&1;
                then tval=true;
                else tval=false;
                fi;
@@ -7112,18 +7117,23 @@ case "$myhostname" in
                                        /[       ]$myhostname[  . ]/p" > hosts
                }
                tmp_re="[       . ]"
-               $test x`$awk "/[0-9].*[  ]$myhostname$tmp_re/ { sum++ }
+               if $test -f hosts; then
+                       $test x`$awk "/[0-9].*[  ]$myhostname$tmp_re/ { sum++ }
                             END { print sum }" hosts` = x1 || tmp_re="[         ]"
-               dflt=.`$awk "/[0-9].*[   ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \
-                       hosts | $sort | $uniq | \
-                       $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"`
-               case `$echo X$dflt` in
-               X*\ *)  echo "(Several hosts in /etc/hosts matched hostname)"
+                       dflt=.`$awk "/[0-9].*[   ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \
+                               hosts | $sort | $uniq | \
+                               $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"`
+                       case `$echo X$dflt` in
+                       X*\ *)  echo "(Several hosts in the database matched hostname)"
+                               dflt=.
+                               ;;
+                       X.) echo "(You do not have fully-qualified names in the hosts database)"
+                               ;;
+                       esac
+               else
+                       echo "(I cannot locate a hosts database anywhere)"
                        dflt=.
-                       ;;
-               X.) echo "(You do not have fully-qualified names in /etc/hosts)"
-                       ;;
-               esac
+               fi
                case "$dflt" in
                .)
                        tans=`./loc resolv.conf X /etc /usr/etc`
@@ -7430,6 +7440,25 @@ else
        installvendorbin="$vendorbinexp"
 fi
 
+: determine whether to only install version-specific parts.
+echo " "
+$cat <<EOM
+Do you want to install only the version-specific parts of the perl
+distribution?  Usually you do *not* want to do this.
+EOM
+case "$versiononly" in
+"$define"|[Yy]*|true) dflt='y' ;;
+*) dflt='n';
+esac
+rp="Do you want to install only the version-specific parts of perl?"
+. ./myread
+case "$ans" in
+[yY]*) val="$define";;
+*)     val="$undef" ;;
+esac
+set versiononly
+eval $setvar
+
 : see if qgcvt exists
 set qgcvt d_qgcvt
 eval $inlibc
@@ -7741,15 +7770,15 @@ int main() {
 EOCP
        : check sys/file.h first, no particular reason here
        if $test `./findhdr sys/file.h` && \
-               $cc $cppflags -DI_SYS_FILE -o access access.c >/dev/null 2>&1 ; then
+               $cc -o access $cppflags -DI_SYS_FILE access.c >/dev/null 2>&1 ; then
                h_sysfile=true;
                echo "<sys/file.h> defines the *_OK access constants." >&4
        elif $test `./findhdr fcntl.h` && \
-               $cc $cppflags -DI_FCNTL -o access access.c >/dev/null 2>&1 ; then
+               $cc -o access $cppflags -DI_FCNTL access.c >/dev/null 2>&1 ; then
                h_fcntl=true;
                echo "<fcntl.h> defines the *_OK access constants." >&4
        elif $test `./findhdr unistd.h` && \
-               $cc $cppflags -DI_UNISTD -o access access.c >/dev/null 2>&1 ; then
+               $cc -o access $cppflags -DI_UNISTD access.c >/dev/null 2>&1 ; then
                echo "<unistd.h> defines the *_OK access constants." >&4
        else
                echo "I can't find the four *_OK access constants--I'll use mine." >&4
@@ -7839,10 +7868,10 @@ int main()
        exit(1);
 }
 EOP
-       if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       if $cc -o set -DTRY_BSD_PGRP $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo "You have to use getpgrp(pid) instead of getpgrp()." >&4
                val="$define"
-       elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       elif $cc -o set $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo "You have to use getpgrp() instead of getpgrp(pid)." >&4
                val="$undef"
        else
@@ -7901,10 +7930,10 @@ int main()
        exit(1);
 }
 EOP
-       if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       if $cc -o set -DTRY_BSD_PGRP $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo 'You have to use setpgrp(pid,pgrp) instead of setpgrp().' >&4
                val="$define"
-       elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       elif $cc -o set $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo 'You have to use setpgrp() instead of setpgrp(pid,pgrp).' >&4
                val="$undef"
        else
@@ -8456,8 +8485,8 @@ EOM
        : Call the object file tmp-dyna.o in case dlext=o.
        if $cc $ccflags $cccdlflags -c dyna.c > /dev/null 2>&1 && 
                mv dyna${_o} tmp-dyna${_o} > /dev/null 2>&1 && 
-               $ld $lddlflags -o dyna.$dlext tmp-dyna${_o} > /dev/null 2>&1 && 
-               $cc $ccflags -o fred $ldflags $cccdlflags $ccdlflags fred.c $libs > /dev/null 2>&1; then
+               $ld -o dyna.$dlext $lddlflags tmp-dyna${_o} > /dev/null 2>&1 && 
+               $cc -o fred $ccflags $ldflags $cccdlflags $ccdlflags fred.c $libs > /dev/null 2>&1; then
                xxx=`./fred`
                case $xxx in
                1)      echo "Test program failed using dlopen." >&4
@@ -11609,6 +11638,9 @@ EOM
 #ifdef __hpux
 #define strtoll __strtoll
 #endif
+#ifdef __EMX__
+#define strtoll _strtoll
+#endif
 #include <stdio.h>
 extern long long int strtoll(char *s, char **, int); 
 static int bad = 0;
@@ -11635,7 +11667,8 @@ int main() {
 EOCP
        set try
        if eval $compile; then
-               case "`./try`" in
+               yyy=`./try`
+               case "$yyy" in
                ok) echo "Your strtoll() seems to be working okay." ;;
                *) cat <<EOM >&4
 Your strtoll() doesn't seem to be working okay.
@@ -11643,6 +11676,9 @@ EOM
                   d_strtoll="$undef"
                   ;;
                esac
+       else
+               echo "(I can't seem to compile the test program--assuming it doesn't)"
+               d_strtoll="$undef"
        fi
        ;;
 esac
@@ -13493,13 +13529,13 @@ $cc $ccflags -c bar1.c >/dev/null 2>&1
 $cc $ccflags -c bar2.c >/dev/null 2>&1
 $cc $ccflags -c foo.c >/dev/null 2>&1
 $ar rc bar$_a bar2$_o bar1$_o >/dev/null 2>&1
-if $cc $ccflags $ldflags -o foobar foo$_o bar$_a $libs > /dev/null 2>&1 &&
+if $cc -o foobar $ccflags $ldflags foo$_o bar$_a $libs > /dev/null 2>&1 &&
        ./foobar >/dev/null 2>&1; then
        echo "$ar appears to generate random libraries itself."
        orderlib=false
        ranlib=":"
 elif $ar ts bar$_a >/dev/null 2>&1 &&
-       $cc $ccflags $ldflags -o foobar foo$_o bar$_a $libs > /dev/null 2>&1 &&
+       $cc -o foobar $ccflags $ldflags foo$_o bar$_a $libs > /dev/null 2>&1 &&
        ./foobar >/dev/null 2>&1; then
                echo "a table of contents needs to be added with '$ar ts'."
                orderlib=false
@@ -14515,7 +14551,7 @@ case "$osname-$gccversion" in
 irix-) ccflags="\$ccflags -woff 1178" ;;
 os2-*) ccflags="\$ccflags -Zlinker /PM:VIO" ;;
 esac
-$cc $optimize \$ccflags $ldflags -o try try.c $libs && ./try$exe_ext
+$cc -o try $optimize \$ccflags $ldflags try.c $libs && ./try$exe_ext
 EOSH
 chmod +x Cppsym.try
 $eunicefix Cppsym.try
@@ -15990,6 +16026,7 @@ vendorlibexp='$vendorlibexp'
 vendorprefix='$vendorprefix'
 vendorprefixexp='$vendorprefixexp'
 version='$version'
+versiononly='$versiononly'
 vi='$vi'
 voidflags='$voidflags'
 xlibpth='$xlibpth'
diff --git a/INSTALL b/INSTALL
index f961024..50e7773 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -85,7 +85,7 @@ extensions that have not been updated for the new naming convention
 with:
 
        perl Makefile.PL POLLUTE=1
-       
+
 Alternatively, you can enable CPP symbol pollution wholesale by
 building perl itself with:
 
@@ -1831,12 +1831,17 @@ anything, you can run
 
 make install will install the following:
 
+    binaries
+
        perl,
            perl5.nnn   where nnn is the current release number.  This
                        will be a link to perl.
        suidperl,
            sperl5.nnn  If you requested setuid emulation.
        a2p             awk-to-perl translator
+
+    scripts
+
        cppstdin        This is used by perl -P, if your cc -E can't
                        read from stdin.
        c2ph, pstruct   Scripts for handling C structures in header files.
@@ -1849,13 +1854,21 @@ make install will install the following:
        pl2pm           Convert Perl 4 .pl files to Perl 5 .pm modules
        pod2html,       Converters from perl's pod documentation format
        pod2latex,      to other useful formats.
-       pod2man, and
-       pod2text
+       pod2man,
+       pod2text,
+       pod2checker,
+       pod2select,
+       pod2usage
        splain          Describe Perl warnings and errors
        dprofpp         Perl code profile post-processor
 
-       library files   in $privlib and $archlib specified to
+    library files
+
+                       in $privlib and $archlib specified to
                        Configure, usually under /usr/local/lib/perl5/.
+
+    documentation
+
        man pages       in $man1dir, usually /usr/local/man/man1.
        module man
        pages           in $man3dir, usually /usr/local/man/man3.
@@ -1864,11 +1877,28 @@ make install will install the following:
 Installperl will also create the directories listed above
 in L<"Installation Directories">.
 
-Perl's *.h header files and the libperl.a library are also installed
+Perl's *.h header files and the libperl library are also installed
 under $archlib so that any user may later build new modules, run the
 optional Perl compiler, or embed the perl interpreter into another
 program even if the Perl source is no longer available.
 
+Sometimes you only want to install the version-specific parts of the perl
+installation.  For example, you may wish to install a newer version of
+perl alongside an already installed production version of perl without
+disabling installation of new modules for the production version.
+To only install the version-specific parts of the perl installation, run
+
+       Configure -Dversiononly
+
+or answer 'y' to the appropriate Configure prompt.  Alternatively,
+you can just manually run
+
+       ./perl installperl -v
+
+and skip installman altogether.
+See also L<"Maintaining completely separate versions"> for another
+approach.
+
 =head1 Coexistence with earlier versions of perl5
 
 In general, you can usually safely upgrade from one version of Perl (e.g.
index 72cb283..703fb69 100644 (file)
@@ -204,11 +204,12 @@ SHELL = $sh
 # how to tr(anslate) newlines
 TRNL = '$trnl'
 
+!GROK!THIS!
 # not used by Makefile but by installperl;
-# mentioned here so that metaconfig picks it up
-INSTALL_USR_BIN_PERL = $installusrbinperl
+# mentioned here so that metaconfig picks these up
+# $installusrbinperl
+# $versiononly
 
-!GROK!THIS!
 
 ## In the following dollars and backticks do not need the extra backslash.
 $spitshell >>Makefile <<'!NO!SUBS!'
index 0899d79..1b93821 100644 (file)
@@ -2886,6 +2886,10 @@ PERL_VERSION (Oldsyms.U):
 perladmin (perladmin.U):
        Electronic mail address of the perl5 administrator.
 
+perllibs (End.U):
+       The list of libraries needed by Perl only (any libraries needed
+       by extensions only will by dropped, if using dynamic loading).
+
 perlpath (perlpath.U):
        This variable contains the eventual value of the PERLPATH symbol,
        which contains the name of the perl interpreter to be used in
@@ -3682,6 +3686,18 @@ version (patchlevel.U):
        This is suitable for use as a directory name, and hence is
        filesystem dependent.
 
+versiononly (versiononly.U):
+       If set, this symbol indicates that only the version-specific
+       components of a perl installation should be installed.
+       This may be useful for making a test installation of a new
+       version without disturbing the existing installation.
+       Setting versiononly is equivalent to setting installperl's -v option.
+       In particular, the non-versioned scripts and programs such as
+       a2p, c2ph, h2xs, pod2*, and perldoc are not installed
+       (see INSTALL for a more complete list).  Nor are the man
+       pages installed.
+       Usually, this is undef.
+
 vi (Loc.U):
        This variable is defined but not used by Configure.
        The value is a plain '' and is not useful.
index 6af2537..bd63468 100644 (file)
@@ -8,7 +8,7 @@
 
 # Package name      : perl5
 # Source directory  : /m/fs/work/work/permanent/perl/pp4/perl
-# Configuration time: Fri Sep  8 23:45:25 EET DST 2000
+# Configuration time: Wed Oct 11 00:34:23 EET DST 2000
 # Configured by     : jhi
 # Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
 
@@ -62,7 +62,7 @@ ccsymbols='__alpha=1 __LANGUAGE_C__=1 __osf__=1 __unix__=1 _LONGLONG=1 _SYSTYPE_
 ccversion='V5.6-082'
 cf_by='jhi'
 cf_email='yourname@yourhost.yourplace.com'
-cf_time='Fri Sep  8 23:45:25 EET DST 2000'
+cf_time='Wed Oct 11 00:34:23 EET DST 2000'
 charsize='1'
 chgrp=''
 chmod=''
@@ -394,7 +394,7 @@ dlext='so'
 dlsrc='dl_dlopen.xs'
 doublesize='8'
 drand01='drand48()'
-dynamic_ext='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re'
+dynamic_ext='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Encode Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re'
 eagain='EAGAIN'
 ebcdic='undef'
 echo='echo'
@@ -403,7 +403,7 @@ emacs=''
 eunicefix=':'
 exe_ext=''
 expr='expr'
-extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re Errno'
+extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Encode Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re Errno'
 fflushNULL='define'
 fflushall='undef'
 find=''
@@ -542,7 +542,7 @@ intsize='4'
 ivdformat='"ld"'
 ivsize='8'
 ivtype='long'
-known_extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re'
+known_extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Encode Fcntl File/Glob GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re'
 ksh=''
 ld='ld'
 lddlflags='-shared -expect_unresolved "*" -msym -std -s'
@@ -634,6 +634,7 @@ path_sep=':'
 perl5='/u/vieraat/vieraat/jhi/Perl/bin/perl'
 perl=''
 perladmin='yourname@yourhost.yourplace.com'
+perllibs='-lm -liconv -lutil -lpthread -lexc'
 perlpath='/opt/perl/bin/perl'
 pg='pg'
 phostname=''
@@ -793,6 +794,7 @@ vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
 version='5.7.0'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth='/usr/lib/386 /lib/386'
index 7213407..a8f9456 100644 (file)
@@ -17,7 +17,7 @@
 /*
  * Package name      : perl5
  * Source directory  : /m/fs/work/work/permanent/perl/pp4/perl
- * Configuration time: Fri Sep  8 23:45:25 EET DST 2000
+ * Configuration time: Wed Oct 11 00:01:55 EET DST 2000
  * Configured by     : jhi
  * Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
  */
  */
 #define HAS_GETPGID            /**/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-#define HAS_GETPGRP            /**/
-/*#define USE_BSD_GETPGRP      / **/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
  */
 #define HAS_SETPGID    /**/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-#define HAS_SETPGRP            /**/
-#define USE_BSD_SETPGRP        /**/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
 #define PERL_XS_APIVERSION "5.7.0"
 #define PERL_PM_APIVERSION "5.005"
 
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+#define HAS_GETPGRP            /**/
+/*#define USE_BSD_GETPGRP      / **/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+#define HAS_SETPGRP            /**/
+#define USE_BSD_SETPGRP        /**/
+
 #endif
index 99776b5..d761059 100644 (file)
@@ -701,6 +701,34 @@ supports dynamic loading, you can also test static loading with
 You can also hand-tweak your config.h to try out different #ifdef
 branches.
 
+=head2 Other tests
+
+=over 4
+
+=item CHECK_FORMAT
+
+To test the correct use of printf-style arguments, C<Configure> with
+S<-Dccflags='-DCHECK_FORMAT -Wformat'> and run C<make>.  The compiler
+will produce warning of incorrect use of format arguments.  CHECK_FORMAT
+changes perl-defined formats to common formats, so DO NOT USE the executable
+produced by this process. 
+
+A more accurate approach is the following commands:
+
+    sh Configure -des -Dccflags=-Wformat ...
+    make miniperl              # without -DCHECK_FORMAT
+    perl -i.orig -pwe 's/-Wformat/-DCHECK_FORMAT $&/' config.sh
+    sh Configure -S
+    make >& make.log           # build from correct miniperl
+    make clean
+    make miniperl >& mini.log  # build miniperl with -DCHECK_FORMAT 
+    perl -nwe 'print if /^\S+:/ and not /^make\b/' mini.log make.log
+    make clean
+
+(-Wformat support by Robin Barker.)
+
+=back
+
 =head1 Running Purify
 
 Purify is a commercial tool that is helpful in identifying memory
index 2163c46..06290c3 100644 (file)
@@ -3,8 +3,8 @@ Perl 5 README file for the EPOC operating system.
 =====================================================================
 
 Olaf Flebbe <o.flebbe@gmx.de>
-http://www.linuxstart.com/~oflebbe/perl/perl5.html
-2000-05-15
+http://members.linuxstart.com/~oflebbe/perl/perl5.html
+2000-09-18
 
 =====================================================================
 Introduction
@@ -13,10 +13,10 @@ Introduction
 EPOC is a OS for palmtops and mobile phones. For more informations look at:
 http://www.symbian.com/
 
-This is a port of Perl version 5.6.0 to EPOC. It runs on the Perl
-Series 5, Series 5mx and the Psion Revo and on the Ericson M128.
-
-Features are left out, because of restrictions of the POSIX support.
+This is a port of perl to EPOC. It runs on the Psion Series 5, 5mx,
+5mx Pro, Psion Revo and on the Ericson M128. I have no report about
+the Psion Netbook or the S7. For information about this hardware
+please refer to http://www.psion.com.
 
 =====================================================================
 Installation/Usage
@@ -32,12 +32,12 @@ left out unicode support modules and modules which will not work with
 this version. (For details look into epoc/createpkg.pl). If you like
 to use them, you are free to copy them from a current perl release.
 
-Copy eshell.exe from the same page you got perl to your EPOC device.
-Start eshell.exe with a double tap.
+Get ESHELL from symbian: 
+http://developer.epocworld.com/downloads/progs/Eshell.zip
 
 Now you can enter: perl -de 0 in order to run the perl debugger. If
 you are leaving perl, you get into the system screen. You have to
-switch back manually to eshell.exe When perl is running, you will see
+switch back manually to ESHELL. When perl is running, you will see
 a task with the name STDOUT in the task list.
 
 ======================================================================
@@ -58,35 +58,47 @@ output to stdout.
 PATH Names
 ======================================================================
 
-Pathnames to executables in eshell.exe have to be written with
-backslashes '\', file arguments to perl with slashes '/'. The default
-drive of perl is the same as the drive perl.exe is located on, the
-default path seems to be '/'.
+ESHELL looks for executables in ?:/System/Programs. The SIS file
+installs perl in this special folder directory. The default drive and
+path are the same as folder the executable resides. The EPOC
+filesystem is case-preserving, not case-sensitive.
+
+EPOC uses the ?: syntax for establishing a search order: First in C: (RAM),
+then on D: (CF Card) and last in Z: (ROM).
+
+The perl @INC search path is now implemented with '?:'. Your perl
+executable can now live on a different drive than the perl library or
+even your scripts.
 
-i.e. command lines look a little bit funny:
+ESHELL paths have to be written with backslashes '\', file arguments
+to perl with slashes '/'. Remember that I/O redirection is done
+internally in perl, so please use slashes for redirects.
 
-D:\perl.exe C:/test.pl >C:/output.txt
+perl.exe C:/test.pl >C:/output.txt
 
 You can automatically search for file on all EPOC drives with a ? as
-the driver letter. For instance ?:\a.txt seraches for C:\a.txt,
+the driver letter. For instance ?:\a.txt searches for C:\a.txt,
 D:\b.txt (and Z:\a.txt).
 
 ======================================================================
 Editors
 ======================================================================
 
-You may have a problem to create perl scripts. A cumbersome workaround
-is to use the OPL Editor and exporting to text.
+A suitable text-editor can be downloaded 
+from symbian http://developer.epocworld.com/downloads/progs/Editor.zip
+
+====================================================================
+Features
+====================================================================
 
-The OPL+ Editor is quite good. (Shareware: http://www.twiddlebit.com)
-There is a port of vim around: 
-        http://www.starship.freeserve.co.uk/index.html
+The built-in function EPOC::getcwd returns the current directory.
 
 ======================================================================
 Restrictions
 ======================================================================
 
-The following things are left out of this perl port:
+Features are left out, because of restrictions of the POSIX support in
+EPOC:
 
 + backquoting, pipes etc.
 
@@ -118,7 +130,7 @@ Sorry, this is far too short.
     You will need the C++ SDK from http://developer.epocworld.com/. 
 
     You will need to set up the cross SDK from 
-    http://www.linuxstart.com/~oflebbe
+    http://members.linuxstart.com/~oflebbe
 
     You may have to adjust config.sh (cc, cppflags) for your epoc 
     install location.
@@ -130,30 +142,27 @@ Sorry, this is far too short.
     Unpack the sources. 
 
       Build a native perl from this sources... 
+
       cp epoc/* .
       ./Configure -S
-      make perl
+      make perl.a
       cp miniperl.native miniperl
       make perl
+      make ext/Errno/pm_to_blib 
       perl link.pl perlmain.o lib/auto/DynaLoader/DynaLoader.a \
-         lib/auto/Data/Dumper.a \
+         lib/auto/Data/Dumper/Dumper.a \
          lib/auto/File/Glob/Glob.a lib/auto/IO/IO.a \
-         lib/auto/Socket/Socket.a perl.a `cat ext.libs`
+         lib/auto/Socket/Socket.a \
+         lib/auto/Fcntl/Fcntl.a lib/auto/Sys/Hostname/Hostname.a \
+       perl.a `cat ext.libs`
       perl createpkg.pl 
-      wine "G:/bin/makesis perl.pkg perl.sis"
-
 
-====================================================================
-Wish List
-====================================================================
+      wine G:/bin/makesis perl.pkg perl.sis
 
-- Threads ?
-- Acess to the GUI?
 
 ====================================================================
 Support Status
 ====================================================================
 
-I'm offering this port "as is".  You can ask me questions, but I can't
-guarantee I'll be able to answer them; I don't know much about Perl
-internals myself.
+I'm offering this port "as is". You can ask me questions, but I can't
+guarantee I'll be able to answer them.
index f7bf25c..8e29acc 100644 (file)
@@ -287,29 +287,38 @@ If you are accustomed to using perl from various command-line
 shells found in UNIX environments, you will be less than pleased
 with what Windows offers by way of a command shell.
 
-The crucial thing to understand about the "cmd" shell (which is
-the default on Windows NT) is that it does not do any wildcard
-expansions of command-line arguments (so wildcards need not be
-quoted).  It also provides only rudimentary quoting.  The only
-(useful) quote character is the double quote (").  It can be used to
-protect spaces in arguments and other special characters.  The
-Windows NT documentation has almost no description of how the
-quoting rules are implemented, but here are some general observations
-based on experiments:  The shell breaks arguments at spaces and
-passes them to programs in argc/argv.  Doublequotes can be used
-to prevent arguments with spaces in them from being split up.
-You can put a double quote in an argument by escaping it with
-a backslash and enclosing the whole argument within double quotes.
-The backslash and the pair of double quotes surrounding the
-argument will be stripped by the shell.
-
-The file redirection characters "<", ">", and "|" cannot be quoted
-by double quotes (there are probably more such).  Single quotes
-will protect those three file redirection characters, but the
-single quotes don't get stripped by the shell (just to make this
-type of quoting completely useless).  The caret "^" has also
-been observed to behave as a quoting character (and doesn't get
-stripped by the shell also).
+The crucial thing to understand about the Windows environment is that
+the command line you type in is processed twice before Perl sees it.
+First, your command shell (usually CMD.EXE on Windows NT, and
+COMMAND.COM on Windows 9x) preprocesses the command line, to handle
+redirection, environment variable expansion, and location of the
+executable to run. Then, the perl executable splits the remaining
+command line into individual arguments, using the C runtime library
+upon which Perl was built.
+
+It is particularly important to note that neither the shell nor the C
+runtime do any wildcard expansions of command-line arguments (so
+wildcards need not be quoted).  Also, the quoting behaviours of the
+shell and the C runtime are rudimentary at best (and may, if you are
+using a non-standard shell, be inconsistent).  The only (useful) quote
+character is the double quote (").  It can be used to protect spaces in
+arguments and other special characters.  The Windows NT documentation
+has almost no description of how the quoting rules are implemented, but
+here are some general observations based on experiments:  The C runtime
+breaks arguments at spaces and passes them to programs in argc/argv.
+Doublequotes can be used to prevent arguments with spaces in them from
+being split up.  You can put a double quote in an argument by escaping
+it with a backslash and enclosing the whole argument within double
+quotes.  The backslash and the pair of double quotes surrounding the
+argument will be stripped by the C runtime.
+
+The file redirection characters "<", ">", and "|" can be quoted by
+double quotes (although there are suggestions that this may not always
+be true).  Single quotes are not treated as quotes by the shell or the C
+runtime.  The caret "^" has also been observed to behave as a quoting
+character, but this appears to be a shell feature, and the caret is not
+stripped from the command line, so Perl still sees it (and the C runtime
+phase does not treat the caret as a quote character).
 
 Here are some examples of usage of the "cmd" shell:
 
@@ -349,6 +358,13 @@ This pipes "foo" to the pager and writes "bar" in the file "blurch":
 Discovering the usefulness of the "command.com" shell on Windows 9x
 is left as an exercise to the reader :)
 
+One particularly pernicious problem with the 4NT command shell for
+Windows NT is that it (nearly) always treats a % character as indicating
+that environment variable expansion is needed.  Under this shell, it is
+therefore important to always double any % characters which you want
+Perl to see (for example, for hash variables), even when they are
+quoted.
+
 =item Building Extensions
 
 The Comprehensive Perl Archive Network (CPAN) offers a wealth
index 337239d..8dcb9be 100644 (file)
--- a/Todo-5.6
+++ b/Todo-5.6
@@ -16,6 +16,20 @@ Unicode support
        to work similarly to Unicode tech reports and Java
        notation \uXXXX (and already existing \x{XXXX))?
        more than four hexdigits? make also \U+XXXX work?
+    overloadable regex assertions? e.g. in Thai \b cannot
+        be deduced by any simple character class boundary rules,
+        word boundaries must algorithmically computed
+
+    see ext/Encode/Todo for notes and references about proper detection
+    of malformed UTF-8
+
+    SCSU?          http://www.unicode.org/unicode/reports/tr6/
+    Collation?     http://www.unicode.org/unicode/reports/tr10/
+    Normalization? http://www.unicode.org/unicode/reports/tr15/
+    EBCDIC?        http://www.unicode.org/unicode/reports/tr16/
+    Regexes?       http://www.unicode.org/unicode/reports/tr18/
+    Case Mappings? http://www.unicode.org/unicode/reports/tr21/
+
     See also "Locales", "Regexen", and "Miscellaneous".
 
 Multi-threading
@@ -156,14 +170,6 @@ Miscellaneous
     sendmsg, recvmsg? (Configure doesn't probe for these but the units exist)
     setitimer, getitimer? (the metaconfig units exist)
 
-Unicode
-    SCSU?          http://www.unicode.org/unicode/reports/tr6/
-    Collation?     http://www.unicode.org/unicode/reports/tr10/
-    Normalization? http://www.unicode.org/unicode/reports/tr15/
-    EBCDIC?        http://www.unicode.org/unicode/reports/tr16/
-    Regexes?       http://www.unicode.org/unicode/reports/tr18/
-    Case Mappings? http://www.unicode.org/unicode/reports/tr21/
-
 Ongoing
     keep filenames 8.3 friendly, where feasible
     upgrade to newer versions of all independently maintained modules
index 023d7ec..03a5f8e 100644 (file)
@@ -238,17 +238,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_getpgid HAS_GETPGID                /**/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-#$d_getpgrp HAS_GETPGRP                /**/
-#$d_bsdgetpgrp USE_BSD_GETPGRP /**/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
@@ -503,18 +492,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_setpgid HAS_SETPGID        /**/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-#$d_setpgrp HAS_SETPGRP                /**/
-#$d_bsdsetpgrp USE_BSD_SETPGRP /**/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
@@ -3187,5 +3164,28 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define PERL_XS_APIVERSION "$xs_apiversion"
 #define PERL_PM_APIVERSION "$pm_apiversion"
 
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+#$d_getpgrp HAS_GETPGRP                /**/
+#$d_bsdgetpgrp USE_BSD_GETPGRP /**/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+#$d_setpgrp HAS_SETPGRP                /**/
+#$d_bsdsetpgrp USE_BSD_SETPGRP /**/
+
 #endif
 !GROK!THIS!
index c0e305e..28ce5e8 100644 (file)
@@ -1,4 +1,4 @@
-$ sav_ver = 'F$VERIFY(0)
+$ sav_ver = 'F$VERIFY(0)'
 $! SET VERIFY
 $!
 $! For example, if you unpacked perl into: [USER.PERL-5n...] then you will 
@@ -254,18 +254,18 @@ $     P'i' = P'i' - "D"
 $     IF (F$LOCATE("=",P'i') .EQ. F$LENGTH(P'i'))
 $     THEN
 $       tmp = P'i' + "=""define"""
-$       'tmp
+$       'tmp'
 $       DELETE/SYMBOL tmp
 $     ELSE 
 $       IF (F$LOCATE("=",P'i') .EQ. (F$LENGTH(P'i') - 1))
 $       THEN
 $         me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
-$         echo "''me': use '-Usymbol=val' not '-Dsymbol='."
+$         echo "''me': use ""-Usymbol=val"" not ""-Dsymbol=""."
 $         echo "''me': ignoring -D",P'i'
 $       ELSE
 $          tmp = F$EXTRACT(0,F$LOCATE("=",P'i'),P'i')
 $          tmp = tmp + "=""" + F$EXTRACT(F$LOCATE("=",P'i')+1,F$LENGTH(P'i'),P'i') + """"
-$         'tmp
+$         'tmp'
 $         DELETE/SYMBOL tmp
 $       ENDIF
 $     ENDIF
@@ -277,17 +277,17 @@ $     P'i' = P'i' - "U"
 $     IF (F$LOCATE("=",P'i') .EQ. F$LENGTH(P'i'))
 $     THEN
 $       tmp = P'i' + "="""""
-$       'tmp
+$       'tmp'
 $       DELETE/SYMBOL tmp
 $     ELSE 
 $       IF (F$LOCATE("=",P'i') .LT. (F$LENGTH(P'i') - 1))
 $       THEN
 $         me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
-$         echo "''me': use '-Dsymbol=val' not '-Usymbol=val'."
+$         echo "''me': use ""-Dsymbol=val"" not ""-Usymbol=val""."
 $         echo "''me': ignoring -U",P'i'
 $       ELSE
 $         tmp = P'i' + "=""undef"""
-$         'tmp
+$         'tmp'
 $         DELETE/SYMBOL tmp
 $       ENDIF
 $     ENDIF
@@ -315,9 +315,10 @@ $!
 $ IF (error)
 $ THEN
 $   me = F$PARSE(me,,,"DIRECTORY")+ F$PARSE(me,,,"NAME")
-$   echo "Usage: @''me' [-dehmrEKOSV] [-fconfig.sh] [-Dsymbol] [-Dsymbol=value]"
+$   echo "Usage: @''me' [-dehmr""EKOSV""] [-fconfig.sh] [""-Dsymbol""] [""-Dsymbol=value""]"
 $   echo "                [-Usymbol]  [-Usymbol=]"
-$   TYPE SYS$INPUT
+$   TYPE SYS$INPUT:
+$   DECK
  "-d" : use defaults for all answers.
  "-e" : go on without questioning past the production of config.sh.    *
  "-f" : specify an alternate default configuration file.
@@ -336,6 +337,7 @@ $   TYPE SYS$INPUT
          -"Usymbol"    symbol gets the value 'undef'
          -"Usymbol="   symbol gets completely empty
   -V  : print version number and exit (with a zero status).
+$   EOD
 $   echo "%Config-I-VMS, lower case switches must be enclosed"
 $   echo "-Config-I-VMS, in double quotation marks, e.g.:"
 $   echo "-Config-I-VMS,   @Configure ""-des"""
@@ -424,10 +426,12 @@ $ IF (tmp .GES. "7.2") .AND. (F$GETSYI("HW_MODEL") .GE. 1024) THEN GOTO Beyond_d
 $   IF (F$ELEMENT(max_allowed_dir_depth,".",F$ENVIRONMENT("Default")).nes.".")
 $   THEN
 $     TYPE SYS$INPUT:
+$     DECK
 %Config-E-VMS, ERROR:
  Sorry! It apears as though your perl build sub-directory is already too
  deep into the VMS file system. Please try moving stuff into a shallower 
  directory (or altering the "max_allowed_dir_depth" parameter).
+$     EOD
 $     echo4 "ABORTING..."
 $     SET DEFAULT 'vms_default_directory_name' !be kind rewind
 $     STOP
@@ -543,6 +547,8 @@ $   ENDIF
 $   IF ((miss_list .NES. "").OR.(manifestfound .EQS. ""))
 $   THEN
 $     TYPE SYS$INPUT:
+$     DECK
+
 
 THIS PACKAGE SEEMS TO BE INCOMPLETE.
 
@@ -551,6 +557,7 @@ distinct possibility that your kit is damaged, by typing 'y'es.  If you
 do, don't blame me if something goes wrong.  I advise you to type 'n'o
 and contact the author (dan@sidhe.org)
 
+$     EOD
 $     READ SYS$COMMAND/PROMPT="Continue? [n] " ans
 $     IF ans
 $     THEN
@@ -622,7 +629,7 @@ $ IF F$TYPE(usedevel) .EQS. "" THEN usedevel := n
 $ patchlevel_h = F$SEARCH("[-]patchlevel.h")
 $ IF (patchlevel_h.NES."")
 $ THEN
-$   SEARCH 'patchlevel_h "define","PERL_VERSION","epoch"/match=and/out=[]ver.out
+$   SEARCH 'patchlevel_h' "define","PERL_VERSION","epoch"/match=and/out=[]ver.out
 $   IF .NOT. usedevel .AND. usedevel .NES. "define"
 $   THEN
 $     OPEN/READ CONFIG []ver.out
@@ -636,6 +643,7 @@ $     IF tmp .NE. 0
 $     THEN
 $       echo4 "patchlevel is " + F$STRING(xpatchlevel)
 $       cat4 SYS$INPUT:
+$       DECK
 *** WHOA THERE!!! ***
 
     This is an UNSTABLE DEVELOPMENT release.
@@ -649,6 +657,7 @@ $       cat4 SYS$INPUT:
     It is most seriously suggested that you do not continue any further
     unless you want to help in developing and debugging Perl.
 
+$       EOD
 $       dflt="n"
 $       rp="Do you really want to continue? [''dflt'] "
 $       IF (fastread) THEN fastread := FALSE
@@ -661,8 +670,6 @@ $       ELSE
 $         echo4 "Okay, bye."
 $         DELETE/NOLOG/NOCONFIRM []ver.out;
 $         GOTO Clean_up
-$         STOP
-$         exit 0
 $       ENDIF
 $     ENDIF
 $     DELETE/SYMBOL line
@@ -694,6 +701,7 @@ $!
 $ IF (needman)
 $ THEN
 $   TYPE SYS$INPUT:
+$   DECK
 
 This installation shell script will examine your system and ask you questions
 to determine how the perl5 package should be installed. If you get
@@ -702,16 +710,20 @@ process, edit something, then restart this process as you just did.
 Many of the questions will have default answers in square
 brackets; typing carriage return will give you the default.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
 $   TYPE SYS$INPUT:
+$   DECK
 
 In a hurry? You may run '@Configure "-d"'.  This will bypass nearly all
 the questions and use the computed defaults (or the previous answers provided 
 there was already a config.sh file). Type '@Configure "-h"' for a list of 
 options.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
 $   TYPE SYS$INPUT:
+$   DECK
 
 Much effort has been expended to ensure that this shell script will
 run on any VMS system.  If despite that it blows up on yours, your
@@ -719,6 +731,7 @@ best bet is to edit Configure.com and @ it again.  Whatever problems
 you have with Configure.com, let me (dan@sidhe.org) know how I blew
 it.
 
+$   EOD
 $!This installation script affects things in two ways:
 $!
 $!1) it may do direct variable substitutions on some of the files included
@@ -798,16 +811,18 @@ $! However, watch out for sig_nam, sig_nam_init, sig_num, startperl
 $! and any of the lower case double quoted variables such as the *format
 $! variables in such a config."sh".
 $!
-$   @'config_sh
+$   @'config_sh'
 $!
 $ ENDIF
 $ DELETE/SYMBOL config_dflt
 $!
 $!we actually do not have "hints/" for VMS
 $!     TYPE SYS$INPUT:
+$!     DECK
 $!
 $!First time through, eh?  I have some defaults handy for the following systems:
 $!
+$!     EOD
 $!     echo "     ","VMS_VAX"
 $!     echo "     ","VMS_AXP"
 $!        : Now look for a hint file osname_osvers, unless one has been
@@ -829,12 +844,14 @@ $ IF (osname .NES. "VMS")
 $ THEN
 $   echo4 "Hmm.. I wonder what ''osname' is (?)"
 $   TYPE SYS$INPUT:
+$   DECK
 
 %Config-E-VMS, ERROR:
 
            Err, you do not appear to be running VMS!
  This procedure is intended to Configure the building of Perl for VMS.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Continue anyway? [n] " ans
 $   IF ans
 $   THEN
@@ -848,11 +865,13 @@ $   ENDIF
 $ ELSE           !we are on VMS huzzah!
 $   IF .NOT.silent 
 $   THEN TYPE SYS$INPUT:
+$   DECK
 
 Configure uses the operating system name and version to set some defaults.
 The default value is probably right if the name rings a bell. Otherwise,
 since spelling matters for me, either accept the default or answer "none"
 to leave it blank.
+$   EOD
 $   ENDIF
 $   rp = "Operating system name? [''osname'] "
 $   GOSUB myread
@@ -1093,10 +1112,13 @@ $!: determine where private library files go
 $!: Usual default is /usr/local/lib/perl5.  Also allow things like 
 $!: /opt/perl/lib, since /opt/perl/lib/perl5 would be redundant.
 $   IF .NOT.silent 
-$   THEN TYPE SYS$INPUT:
+$   THEN
+$     TYPE SYS$INPUT:
+$     DECK
 
 There are some auxiliary files for perl5 that need to be put into a
 private library directory that is accessible by everyone.
+$     EOD
 $   ENDIF
 $   IF F$TYPE(privlib) .NES. ""
 $   THEN dflt = privlib
@@ -1219,10 +1241,13 @@ $     echo ""
 $     echo "''package' contains architecture-dependent library files.  If you are"
 $   ENDIF
 $   IF (.NOT.silent) 
-$   THEN TYPE SYS$INPUT:
+$   THEN
+$     TYPE SYS$INPUT:
+$     DECK
 sharing libraries in a heterogeneous environment, you might store
 these files in a separate location.  Otherwise, you can just include
 them with the rest of the public library files.
+$     EOD
 $   ENDIF
 $   IF F$TYPE(archlib) .NES. ""
 $   THEN dflt = archlib
@@ -1241,10 +1266,11 @@ $!
 $! This quotation from Configure has to be included on VMS:
 $!
 $ TYPE SYS$INPUT:
+$ DECK
 
 There is, however, a strange, musty smell in the air that reminds me of
 something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit.
-$ CONTINUE
+$ EOD
 $ IF (.NOT.vms_skip_install)
 $ THEN
 $!: it so happens the Eunice I know will not run shell scripts in Unix format
@@ -1254,12 +1280,15 @@ $!: now see if they want to do setuid emulation   !sfn
 $!
 $!: determine where site specific libraries go.
 $   IF .NOT.silent 
-$   THEN TYPE SYS$INPUT:
+$   THEN
+$     TYPE SYS$INPUT:
+$     DECK
 
 The installation process will also create a directory for
 site-specific extensions and modules.  Some users find it convenient
 to place all local files in this directory rather than in the main
 distribution directory.
+$     EOD
 $   ENDIF
 $   IF F$TYPE(sitelib) .NES. ""
 $   THEN dflt = sitelib
@@ -1276,9 +1305,11 @@ $!
 $!: determine where site specific architecture-dependent libraries go.
 $   IF .NOT.silent 
 $   THEN TYPE SYS$INPUT:
+$     DECK
 
 The installation process will also create a directory for
 architecture-dependent site-specific extensions and modules.
+$     EOD
 $   ENDIF
 $   IF F$TYPE(sitearch) .NES. ""
 $   THEN dflt = sitearch
@@ -1447,7 +1478,7 @@ $ IF (silent) THEN GOSUB Shut_up
 $ CLOSE CONFIG
 $ IF (tmp.NE.%X10000001).and.(tmp.ne.%X00030001)
 $ THEN
-$   echo "Symbol ""''gcc_symbol'"" is not defined. I guess you don't have it."
+$   echo "Symbol ""''gcc_symbol'"" is not defined. I guess you do not have it."
 $   DELETE/NOLOG/NOCONFIRM gccvers.lis;
 $   GOTO Cxx_initial_check
 $ ENDIF
@@ -1465,11 +1496,11 @@ $Cxx_initial_check:
 $!
 $! Do note that [vms]perl source files have a ways to go before they will 
 $! compile under CXX.
-$! In order to test Configure.com with CXX swap the '!' comment character 
-$! between the following two lines.  
+$! In order to test Configure.com with CXX invoke it with "-Dtry_cxx" on
+$! the command line.
 $!
-$! IF 1 .eq. 1
-$ IF 1 .eq. 0
+$ IF F$TYPE(try_cxx) .EQS. "" THEN try_cxx := n
+$ IF try_cxx .OR. try_cxx .EQS. "define"
 $!
 $ THEN
 $!
@@ -1572,22 +1603,23 @@ $   THEN
 $     Mcc = "cxx"
 $     using_cxx := Y
 $     ld = ld_try
-$!     C_COMPILER_Replace = "CC=cc=''Mcc'"
-$   ENDIF
-$   IF Mcc.NES.dflt
-$   THEN
-$     IF F$LOCATE("dec",dflt) .NE. F$LENGTH(dflt) .or. -
-         F$LOCATE("compaq",dflt) .NE. F$LENGTH(dflt)
-$     THEN 
-$       C_COMPILER_Replace = "CC=cc=''Mcc'"
-$     ELSE
-$       Using_Dec_C := Y
-$     ENDIF
-$   ELSE
-$     IF Mcc .EQS. "cc/decc"
+$     C_COMPILER_Replace = "CC=cc=''Mcc'"
+$   ELSE ! Not_cxx
+$     IF Mcc.NES.dflt
 $     THEN
-$       Using_Dec_C := Y
-$       C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       IF F$LOCATE("dec",dflt) .NE. F$LENGTH(dflt) .or. -
+           F$LOCATE("compaq",dflt) .NE. F$LENGTH(dflt)
+$       THEN 
+$         C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       ELSE
+$         Using_Dec_C := Y
+$       ENDIF
+$     ELSE
+$       IF Mcc .EQS. "cc/decc"
+$       THEN
+$         Using_Dec_C := Y
+$         C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       ENDIF
 $     ENDIF
 $   ENDIF
 $ ELSE 
@@ -1608,7 +1640,7 @@ $ ccversion=""
 $ IF Using_Dec_C
 $ THEN
 $   echo ""
-$   echo4 "Checking for Dec C's version number..."
+$   echo4 "Checking for the Dec C version number..."
 $   OPEN/WRITE CONFIG deccvers.c
 $   WRITE CONFIG "#include <stdlib.h>"  !DECC is sooo picky
 $   WRITE CONFIG "#include <stdio.h>"
@@ -1703,7 +1735,6 @@ $   THEN
 $     echo ""
 $     echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4
 $     OPEN/WRITE CONFIG gccvers.c
-$!     WRITE CONFIG "#include <stdlib.h>"  !DECC is sooo picky
 $     WRITE CONFIG "#include <stdio.h>"
 $     WRITE CONFIG "int main() {"
 $     WRITE CONFIG "#ifdef __GNUC__"
@@ -1927,13 +1958,16 @@ $ ENDIF
 $ myhostname = myhostname - mydomain
 $ echo "(Trimming domain name from host name--host name is now ''myhostname')"
 $ IF .NOT.silent 
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$   TYPE SYS$INPUT:
+$   DECK
 
 I need to get your e-mail address in Internet format if possible, i.e.
 something like user@host.domain. Please answer accurately since I have
 no easy means to double check it. The default value provided below
 is most probably close to the reality but may not be valid from outside
 your organization...
+$   EOD
 $ ENDIF
 $ dflt = "''cf_by'@''myhostname'"+"''mydomain'"
 $ rp = "What is your e-mail address? [''dflt'] "
@@ -1944,13 +1978,16 @@ $ ELSE cf_email = dflt
 $ ENDIF
 $!
 $ IF .NOT.silent 
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$   TYPE SYS$INPUT:
+$   DECK
 
 If you or somebody else will be maintaining perl at your site, please
 fill in the correct e-mail address here so that they may be contacted
 if necessary. Currently, the "perlbug" program included with perl
 will send mail to this address in addition to perlbug@perl.com. You may
 enter "none" for no administrator.
+$   EOD
 $ ENDIF
 $ dflt = "''cf_email'"
 $ rp = "Perl administrator e-mail address [''dflt'] "
@@ -1988,15 +2025,15 @@ $ IF (F$SEARCH(F$PARSE("SocketShr","Sys$Share:.Exe")).NES."")
 $ THEN
 $   Has_socketshr     = "T"
 $   echo ""
-$   echo4 "Hmm... Looks like you have SOCKETSHR's Berkeley networking support."
+$   echo4 "Hmm... Looks like you have SOCKETSHR Berkeley networking support."
 $ ELSE
 $   Has_socketshr     = "F"
 $ ENDIF
-$ IF (Dec_C_Version .GE. 50200000)
+$ IF (Dec_C_Version .GE. 50200000) .or. using_cxx
 $ THEN
 $   Has_Dec_C_Sockets = "T"
 $   echo ""
-$   echo4 "Hmm... Looks like you've got Dec C's Berkeley networking support."
+$   echo4 "Hmm... Looks like you have Dec C Berkeley networking support."
 $ ELSE
 $   Has_Dec_C_Sockets = "F"
 $ ENDIF
@@ -2004,8 +2041,8 @@ $ ! Hey, we've got both. Default to Dec C, then, since it's better
 $ IF Has_socketshr .OR. Has_Dec_C_Sockets
 $ THEN
 $   echo ""
-$   echo "You've got sockets available. Which socket stack do you want to"
-$   echo "build into perl?"
+$   echo "You have sockets available.  Which socket stack do you want to"
+$   echo "build into Perl?"
 $   IF Has_Dec_C_Sockets
 $   THEN
 $     dflt = "DECC"
@@ -2046,11 +2083,11 @@ $ ENDIF
 $!
 $! Ask if they want to build with DEBUGGING
 $ echo ""
-$ echo "Perl can be built with extra runtime debugging enabled. This
-$ echo "enables the -D switch, at the cost of some performance. It
-$ echo "was mandatory on perl 5.005 and before on VMS, but is now
-$ echo "optional. If you don't generally use it you should probably
-$ echo "leave this off and gain a bit of extra speed.
+$ echo "Perl can be built with extra runtime debugging enabled. This"
+$ echo "enables the -D switch, at the cost of some performance.  It"
+$ echo "was mandatory on perl 5.005 and before on VMS, but is now"
+$ echo "optional.  If you do not generally use it you should probably"
+$ echo "leave this off and gain a bit of extra speed."
 $ dflt = "y"
 $ rp = "Build a DEBUGGING version of Perl? [''dflt'] "
 $ GOSUB myread
@@ -2066,9 +2103,9 @@ $! Ask if they want to build with MULTIPLICITY
 $ echo ""
 $ echo "Perl can be built so that multiple Perl interpreters can coexist"
 $ echo "within the same Perl executable."
-$ echo "There is some performance overhead, however, so you
-$ echo "probably don't want to choose this unless you're going to be doing
-$ echo "things with embedded perl."
+$ echo "There is some performance overhead, however, so you"
+$ echo "probably do not want to choose this unless you are going to be" 
+$ echo "doing things with embedded perl."
 $ dflt = "n"
 $ rp = "Build Perl for multiplicity? [''dflt'] "
 $ GOSUB myread
@@ -2085,55 +2122,51 @@ $ IF (archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ge
 $ THEN
 $   dflt = use64bitint
 $   echo ""
-$   echo "You can have native 64-bit long integers.
+$   echo "You can have native 64-bit long integers."
 $   echo ""
-$   echo "Perl can be built to take advantage of 64-bit integer types
-$   echo "on some systems, which provide a much larger range for perl's 
-$   echo "mathematical operations.  (Note that does *not* enable 64-bit 
+$   echo "Perl can be built to take advantage of 64-bit integer types"
+$   echo "on some systems, which provide a much larger range for perl's"
+$   echo "mathematical operations.  (Note that does *not* enable 64-bit"
 $   echo "fileops at the moment, as Dec C doesn't do that yet)."
-$   echo "Choosing this option will most probably introduce binary incompatibilities.
+$   echo "Choosing this option will most probably introduce binary incompatibilities."
 $   echo ""
-$   echo "If this doesn't make any sense to you, just accept the default ''dflt'.
+$   echo "If this does not make any sense to you, just accept the default ''dflt'."
 $   rp = "Try to use 64-bit integers, if available? [''dflt'] "
 $   GOSUB myread
 $   IF ans .EQS. "" THEN ans = dflt
-$   IF (f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE")) .EQS. "Y")
-$   THEN
-$     use64bitint="Y"
-$   ELSE
-$     use64bitint="N"
+$   IF ans
+$   THEN use64bitint="Y"
+$   ELSE use64bitint="N"
 $   ENDIF
 $   IF (use64bitint)
 $   THEN
 $     dflt = use64bitall
 $     echo ""
-$     echo "Since you chose 64-bitness you may want to try maximal 64-bitness.
-$     echo "What you have chosen is minimal 64-bitness which means just enough
-$     echo "to get 64-bit integers.  The maximal means using as much 64-bitness
-$     echo "as is possible on the platform.  This in turn means even more binary
-$     echo "incompatibilities.  On the other hand, your platform may not have
-$     echo "any more maximal 64-bitness than what you already have chosen.
+$     echo "Since you chose 64-bitness you may want to try maximal 64-bitness."
+$     echo "What you have chosen is minimal 64-bitness which means just enough"
+$     echo "to get 64-bit integers.  The maximal means using as much 64-bitness"
+$     echo "as is possible on the platform.  This in turn means even more binary"
+$     echo "incompatibilities.  On the other hand, your platform may not have"
+$     echo "any more maximal 64-bitness than what you already have chosen."
 $     echo ""
-$     echo "If this doesn't make any sense to you, just accept the default ''dflt'.
+$     echo "If this does not make any sense to you, just accept the default ''dflt'."
 $     rp = "Try to use full 64-bit support, if available? [''dflt'] "
 $     GOSUB myread
 $     IF ans .EQS. "" THEN ans = dflt
-$     IF (f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE")) .EQS. "Y")
-$     THEN
-$       use64bitall="Y"
-$     ELSE
-$       use64bitall="N"
+$     IF ans
+$     THEN use64bitall="Y"
+$     ELSE use64bitall="N"
 $     ENDIF
 $   ENDIF
 $ ENDIF ! AXP && >= 7.1
 $!
 $! Ask about threads, if appropriate
-$ if Using_Dec_C
+$ IF Using_Dec_C .OR. using_cxx
 $ THEN
 $   echo ""
-$   echo "This version of Perl can be built with threads. While really nifty,
-$   echo "they are a beta feature, and there is a speed penalty for perl
-$   echo "programs if you build with threads *even if you don't use them*
+$   echo "This version of Perl can be built with threads. While really nifty,"
+$   echo "they are a beta feature, and there is a speed penalty for perl"
+$   echo "programs if you build with threads *even if you do not use them*."
 $   dflt = "n"
 $   rp = "Build with threads? [''dflt'] "
 $   GOSUB myread
@@ -2141,22 +2174,21 @@ $   if ans.eqs."" then ans = dflt
 $   if (f$extract(0, 1, "''ans'").eqs."Y").or.(f$extract(0, 1, "''ans'").eqs."y")
 $   THEN
 $     use_threads="T"
-$!
 $     ! Shall we do the 5.005-stype threads, or IThreads?
-$     echo "As of 5.5.640, Perl has two different internal threading
-$     echo "implementations, the 5.005 version (5005threads) and an
-$     echo "interpreter-based version (ithreads) that has one
-$     echo "interpreter per thread.  Both are very experimental.  This
-$     echo "arrangement exists to help developers work out which one
-$     echo "is better.
-$     echo "
-$     echo "If you're a casual user, you probably don't want
-$     echo "interpreter-threads at this time.  There doesn't yet exist
-$     echo "a way to create threads from within Perl in this model,
-$     echo "i.e., ""use Thread;"" will NOT work.
-$     echo "
+$     echo "As of 5.5.640, Perl has two different internal threading"
+$     echo "implementations, the 5.005 version (5005threads) and an"
+$     echo "interpreter-based version (ithreads) that has one"
+$     echo "interpreter per thread.  Both are very experimental.  This"
+$     echo "arrangement exists to help developers work out which one"
+$     echo "is better."
+$     echo ""
+$     echo "If you are a casual user, you probably do not want"
+$     echo "interpreter-threads at this time.  There doesn't yet exist"
+$     echo "a way to create threads from within Perl in this model,"
+$     echo "i.e., ""use Thread;"" will NOT work."
+$     echo ""
 $     dflt = "n"
-$     rp = "Build with Interpreter threads? [''dflt']
+$     rp = "Build with Interpreter threads? [''dflt'] "
 $     GOSUB myread
 $     if ans.eqs."" then ans = dflt
 $     if (f$extract(0, 1, "''ans'").eqs."Y").or.(f$extract(0, 1, "''ans'").eqs."y")
@@ -2171,14 +2203,14 @@ $     ! Are they on VMS 7.1 on an alpha?
 $     if (archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
 $     THEN
 $       echo ""
-$       echo "Threaded perl can be linked to use multiple kernel threads
-$       echo "and system upcalls on VMS 7.1+ on Alpha systems. This feature
-$       echo "allows multiple threads to execute simultaneously on an SMP
-$       echo "system as well as preventing a single thread from blocking
-$       echo "all the threads in a program, even on a single-processor
-$       echo "machine. Unfortunately this feature isn't safe on an
-$       echo "unpatched 7.1 system. (Several OS patches were required when
-$       echo "this procedure was written)
+$       echo "Threaded perl can be linked to use multiple kernel threads"
+$       echo "and system upcalls on VMS 7.1+ on Alpha systems.  This feature"
+$       echo "allows multiple threads to execute simultaneously on an SMP"
+$       echo "system as well as preventing a single thread from blocking"
+$       echo "all the threads in a program, even on a single-processor"
+$       echo "machine.  Unfortunately, this feature isn't safe on an"
+$       echo "unpatched 7.1 system (several OS patches were required when"
+$       echo "this procedure was written)."
 $       dflt = "n"
 $       rp = "Enable multiple kernel threads and upcalls? [''dflt'] "
 $       gosub myread
@@ -2190,47 +2222,48 @@ $       ENDIF
 $     ENDIF
 $   ENDIF
 $ ENDIF
-$ if archname .eqs. "VMS_AXP"
-$ then
-$!
+$ IF archname .EQS. "VMS_AXP"
+$ THEN
 $! Case sensitive?
-$ echo ""
-$ echo "By default, perl (and pretty much everything else on VMS) uses
-$ echo "case-insensitive linker symbols. Which is to say, when the
-$ echo "underlying C code makes a call to a routine called Perl_foo in
-$ echo "the source, the name in the object modules or shareable images
-$ echo "is really PERL_FOO. There are some packages that use an
-$ echo "embedded perl interpreter that instead require case-sensitive
-$ echo "linker symbols.
-$ echo ""
-$ echo "If you have no idea what this means, and don't have
-$ echo "any program requiring anything, choose the default.
-$ dflt = be_case_sensitive
-$ rp = "Build with case-sensitive symbols? [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
-$ be_case_sensitive = "''ans'"
-$!
+$   echo ""
+$   echo "By default, perl (and pretty much everything else on VMS) uses"
+$   echo "case-insensitive linker symbols. Which is to say, when the"
+$   echo "underlying C code makes a call to a routine called Perl_foo in"
+$   echo "the source, the name in the object modules or shareable images"
+$   echo "is really PERL_FOO. There are some packages that use an"
+$   echo "embedded perl interpreter that instead require case-sensitive"
+$   echo "linker symbols."
+$   echo ""
+$   echo "If you have no idea what this means, and do not have"
+$   echo "any program requiring anything, choose the default."
+$   dflt = be_case_sensitive
+$   rp = "Build with case-sensitive symbols? [''dflt'] "
+$   GOSUB myread
+$   IF ans .EQS. "" THEN ans="''dflt'"
+$   be_case_sensitive = "''ans'"
 $! IEEE math?
-$ echo ""
-$ echo "Perl normally uses G_FLOAT format floating point numbers
-$ echo "internally, as do most things on VMS. You can, however, build
-$ echo "with IEEE floating point numbers instead if you need to.
-$ dflt = use_ieee_math
-$ rp = "Use IEEE math? [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
-$ use_ieee_math = "''ans'"
-$ endif
+$   echo ""
+$   echo "Perl normally uses G_FLOAT format floating point numbers"
+$   echo "internally, as do most things on VMS.  You can, however, build"
+$   echo "with IEEE floating point numbers instead if you need to."
+$   dflt = use_ieee_math
+$   rp = "Use IEEE math? [''dflt'] "
+$   GOSUB myread
+$   IF ans .eqs. "" THEN ans = "''dflt'"
+$   use_ieee_math = "''ans'"
+$ ENDIF
 $! CC Flags
 $ echo ""
-$ echo "You can, if you need to, pass extra flags on to the C
-$ echo "compiler.  In general you should only do this if you really,
-$ echo "really know what you're doing.
+$ echo "Your compiler may want other flags.  For this question you should include"
+$ echo "/INCLUDE=(whatever) and /DEFINE=(whatever), flags and any other flags"
+$ echo "or qualifiers used by the compiler."
+$ echo ""
+$ echo "To use no flags, specify the word ""none""."
 $ dflt = user_c_flags
-$ rp = "Extra C flags [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
+$ rp = "Any additional cc flags? [''dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans = "''dflt'"
+$ IF ans .EQS. "none" THEN ans = ""
 $ user_c_flags = "''ans'"
 $!
 $! Ask whether they want to use secure logical translation when tainting
@@ -2267,8 +2300,8 @@ $ echo "file types of nothing, .pl, and .com, in that order (e.g. typing"
 $ echo """$ perl foo"" would cause Perl to look for foo., then foo.pl, and"
 $ echo "finally foo.com)."
 $ echo ""
-$ echo "This is currently broken in some configurations. Only enable it if
-$ echo "you know what you're doing. "
+$ echo "This is currently broken in some configurations. Only enable it if"
+$ echo "you know what you are doing."
 $ dflt = "n"
 $ rp = "Always use default file types? [''dflt'] "
 $ GOSUB myread
@@ -2277,15 +2310,18 @@ $ IF ans
 $ THEN d_alwdeftype := Y
 $ ELSE d_alwdeftype := N
 $ ENDIF
-$!
 $! Ask if they want to use perl's memory allocator
 $ echo ""
-$ echo "Perl has a built-in memory allocator that's tuned for perl's
-$ echo "normal memory usage. It's oftentimes better than the standard
-$ echo "system memory allocator. It also has the advantage of providing
-$ echo "memory allocation statistics, if you choose to enable them.
+$ echo "Perl has a built-in memory allocator that is tuned for normal"
+$ echo "memory usage.  It is oftentimes better than the standard system"
+$ echo "memory allocator.  It also has the advantage of providing memory"
+$ echo "allocation statistics, if you choose to enable them."
 $ dflt = "n"
-$ rp = "Build with perl's memory allocator? [''dflt'] "
+$ IF F$TYPE(usemymalloc) .EQS. "STRING"
+$ THEN
+$   IF usemymalloc THEN dflt = "y"
+$ ENDIF
+$ rp = "Do you wish to attempt to use the malloc that comes with ''package'? [''dflt'] "
 $ GOSUB myread
 $ IF ans .eqs. "" THEN ans = dflt
 $ IF ans
@@ -2297,23 +2333,23 @@ $ THEN
 $   IF use_debugging_perl
 $   THEN
 $     echo ""
-$     echo "Perl can keep statistics on memory usage if you choose to use
-$     echo "them. This is useful for debugging, but does have some
-$     echo "performance overhead.
+$     echo "Perl can keep statistics on memory usage if you choose to use"
+$     echo "them.  This is useful for debugging, but does have some"
+$     echo "performance overhead."
 $     dflt = "n"
 $     rp = "Do you want the debugging memory allocator? [''dflt'] "
 $     gosub myread
-$     if ans.eqs."" then ans="''dflt'"
+$     IF ans .eqs. "" THEN ans = "''dflt'"
 $     use_debugmalloc = f$extract(0, 1, f$edit(ans, "COLLAPSE,UPCASE"))
 $   ENDIF
 $   ! Check which memory allocator we want
 $   echo ""
-$   echo "There are currently three different memory allocators: the
-$   echo "default (which is a pretty good general-purpose memory manager),
-$   echo "the TWO_POT allocator (which is optimized to save memory for
-$   echo "larger allocations), and PACK_MALLOC (which is optimized to save
-$   echo "memory for smaller allocations). They're all good, but if your
-$   echo "usage tends towards larger chunks use TWO_POT, otherwise use
+$   echo "There are currently three different memory allocators: the"
+$   echo "default (which is a pretty good general-purpose memory manager),"
+$   echo "the TWO_POT allocator (which is optimized to save memory for"
+$   echo "larger allocations), and PACK_MALLOC (which is optimized to save"
+$   echo "memory for smaller allocations). They're all good, but if your"
+$   echo "usage tends towards larger chunks use TWO_POT, otherwise use"
 $   echo "PACK_MALLOC."
 $   dflt = "DEFAULT"
 $   rp = "Memory allocator (DEFAULT, TWO_POT, PACK_MALLOC) [''dflt'] "
@@ -2325,17 +2361,15 @@ $ ENDIF
 $!
 $! Ask for their default list of extensions to build
 $ echo ""
-$ echo "It's time to specify which modules you want to build into
-$ echo "perl. Most of these are standard and should be chosen, though
-$ echo "you might, for example, want to build GDBM_File instead of
-$ echo "SDBM_File if you have the GDBM library built on your machine.
-$ echo "Whatever you do, make sure the re module is first or things will
-$ echo "break badly"
-$ echo "
+$ echo "It is time to specify which modules you want to build into"
+$ echo "perl. Most of these are standard and should be chosen, though"
+$ echo "you might, for example, want to build GDBM_File instead of"
+$ echo "SDBM_File if you have the GDBM library built on your machine."
+$ echo ""
 $ echo "Which modules do you want to build into perl?"
 $! dflt = "Fcntl Errno File::Glob IO Opcode Byteloader Devel::Peek Devel::DProf Data::Dumper attrs re VMS::Stdio VMS::DCLsym B SDBM_File"
 $ dflt = "re Fcntl Errno File::Glob IO Opcode Devel::Peek Devel::DProf Data::Dumper attrs VMS::Stdio VMS::DCLsym B SDBM_File Storable Thread Sys::Hostname"
-$ if Using_Dec_C
+$ IF Using_Dec_C .OR. using_cxx
 $ THEN
 $   dflt = dflt + " POSIX"
 $ ENDIF
@@ -2447,18 +2481,20 @@ $   ELSE build = ans
 $   ENDIF
 $ ELSE
 $   TYPE SYS$INPUT:
+$   DECK
 
 %Config-E-VMS, ERROR:
  Well this looks pretty serious. Perl5 cannot be compiled without a "make"
  utility of some sort and after checking my "builders" list I cannot find
  the symbol or command you use on your system to compile programs.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Which ""MMS"" do you use? " ans
 $   ans = F$EDIT(ans,"TRIM, COMPRESS")
 $   ans = F$EXTRACT(0,F$LOCATE(" ",ans),ans) !throw out "-f Makefile." here
 $   IF (ans .EQS. "") 
 $   THEN build = dflt
-$     echo "I don't know where 'make' is, and my life depends on it."
+$     echo "I do not know where ""make"" is, and my life depends on it."
 $     echo "Go find a make program or fix your DCL$PATH setting!"
 $     echo "ABORTING..."
 $     SET DEFAULT 'vms_default_directory_name' !be kind rewind
@@ -2473,13 +2509,17 @@ $ DELETE/NOLOG Makefile.;
 $ GOTO Beyond_open
 $Open_error:
 $ TYPE SYS$INPUT:
+$ DECK
 
  There seems to be trouble. I just tried to create a file in
+$ EOD
 $ echo4 'F$ENVIRONMENT("DEFAULT")'
 $ TYPE SYS$INPUT:
+$ DECK
  but was unsuccessful. I am stopping now. Please check that directories'
  PROTECTION bits. I will leave you in the directory where you started
  Configure.com
+$ EOD
 $ echo4 "ABORTING..."
 $ GOTO Clean_up
 $ STOP
@@ -2521,22 +2561,22 @@ $   DEFmakefile = "Makefile."      !wrt DEF dir (?)
 $   Makefile_SH = "Makefile.in"
 $ ENDIF
 $!
-$ IF macros.NES."" 
-$ THEN 
+$ IF macros .NES. "" 
+$ THEN
 $   tmp = F$LENGTH(macros)
 $   macros = F$EXTRACT(0,(tmp-1),macros) !miss trailing comma
 $   macros = "/macro=(" + macros  + ")"
 $ ENDIF
 $! Build up the extra C flags
 $!
-$ if use_ieee_math
-$ then
+$ IF use_ieee_math
+$ THEN
 $   extra_flags = "''extra_flags'" + "/float=ieee/ieee=denorm_results"
-$ endif
-$ if be_case_sensitive
-$ then
+$ ENDIF
+$ IF be_case_sensitive
+$ THEN
 $   extra_flags = "''extra_flags'" + "/Names=As_Is"
-$ endif
+$ ENDIF
 $ extra_flags = "''extra_flags'" + "''user_c_flags'"
 $!
 $ min_pgflquota = "100000"
@@ -2564,7 +2604,7 @@ $!  - use built config.sh to take config_h.SH -> config.h
 $!  - also take vms/descrip_mms.template -> descrip.mms (VMS Makefile)
 $!              vms/Makefile.in -> Makefile. (VMS GNU Makefile?)
 $!              vms/Makefile.SH -> Makefile. (VMS GNU Makefile?)
-$!  - build Build_Ext.Com extension builder procedure.
+$!  - build make_ext.com extension builder procedure.
 $!
 $! Note for folks from other platforms changing things in here:
 $!
@@ -2701,7 +2741,7 @@ $   libs="SYS$SHARE:CMA$LIB_SHR.EXE/SHARE SYS$SHARE:CMA$RTL.EXE/SHARE SYS$SHARE:
 $ ELSE
 $   libs=" "
 $ ENDIF
-$ IF Using_Dec_C
+$ IF Using_Dec_C .OR. using_cxx
 $ THEN
 $   libc="(DECCRTL)"
 $ ELSE
@@ -2843,14 +2883,14 @@ $!
 $type_size_check: 
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
 $ WS "printf(""%d\n"", sizeof(''tmp'));"
-$ WS "exit(0);
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile
@@ -2860,15 +2900,15 @@ $!: locate header file
 $findhdr:
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
 $ WS "#include <''tmp'>"
-$ WS "int main()
+$ WS "int main()"
 $ WS "{"
 $ WS "printf(""define\n"");"
-$ WS "exit(0);
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB link_ok
@@ -2955,18 +2995,18 @@ $!
 $! Check for __STDC__
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "#ifdef __STDC__
-$ WS "printf(""42\n"");
-$ WS "#else
-$ WS "printf(""1\n"");
-$ WS "#endif
-$ WS "exit(0);
+$ WS "#ifdef __STDC__"
+$ WS "printf(""42\n"");"
+$ WS "#else"
+$ WS "printf(""1\n"");"
+$ WS "#endif"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile
@@ -2988,14 +3028,14 @@ $!
 $! Check for long double size
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "printf(""%d\n"", sizeof(long double));
-$ WS "exit(0);
+$ WS "printf(""%d\n"", sizeof(long double));"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ echo4 "Checking to see if you have long double..."
@@ -3016,14 +3056,14 @@ $ ENDIF
 $!
 $!: check for long long
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "printf(""%d\n"", sizeof(long long));
-$ WS "exit(0);
+$ WS "printf(""%d\n"", sizeof(long long));"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ echo4 "Checking to see if you have long long..."
@@ -3046,15 +3086,15 @@ $! Check the prototype for getgid
 $!
 $ echo "Looking for the type for group ids returned by getgid()."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "gid_t foo;
-$ WS "exit(0);
+$ WS "gid_t foo;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile_ok
@@ -3072,15 +3112,15 @@ $! Check to see if we've got dev_t
 $!
 $ echo "Looking for the type for dev."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "dev_t foo;
-$ WS "exit(0);
+$ WS "dev_t foo;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile_ok
@@ -3124,26 +3164,26 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
-$   WS "#include <types.h>
-$   IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "#include <types.h>"
+$   IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>"
 $   IF Has_Socketshr
 $   THEN
 $     WS "#include <socketshr.h>"
 $   ELSE
-$     WS "#include <time.h>
-$     WS "#include <socket.h>
+$     WS "#include <time.h>"
+$     WS "#include <socket.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "fd_set *foo;
-$   WS "int bar;
-$   WS "foo = NULL;
-$   WS "bar = select(2, foo, foo, foo, NULL);
-$   WS "exit(0);
+$   WS "fd_set *foo;"
+$   WS "int bar;"
+$   WS "foo = NULL;"
+$   WS "bar = select(2, foo, foo, foo, NULL);"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   GOSUB compile_ok
@@ -3165,25 +3205,25 @@ $! Check to see if fd_set exists
 $!
 $ echo "Checking to see how well your C compiler handles fd_set and friends ..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
 $ IF Has_Socketshr
 $ THEN
 $   WS "#include <socketshr.h>"
 $ ENDIF
 $ IF Has_Dec_C_Sockets
 $ THEN
-$   WS "#include <time.h>
-$   WS "#include <socket.h>
+$   WS "#include <time.h>"
+$   WS "#include <socket.h>"
 $ ENDIF
-$ WS "int main()
+$ WS "int main()"
 $ WS "{"
-$ WS "fd_set *foo;
-$ WS "int bar;
-$ WS "exit(0);
+$ WS "fd_set *foo;"
+$ WS "int bar;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile_ok
@@ -3207,19 +3247,19 @@ $! Check to see if off64_t exists
 $!
 $ echo4 "Checking to see if you have off64_t..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#''i_inttypes IIH
-$ WS "#ifdef IIH
-$ WS "#include <inttypes.h>
-$ WS "#endif
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
 $ WS "{"
-$ WS "off64_t bar;
-$ WS "exit(0);
+$ WS "off64_t bar;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile_ok
@@ -3236,19 +3276,19 @@ $! Check to see if fpos64_t exists
 $!
 $ echo4 "Checking to see if you have fpos64_t..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#''i_inttypes IIH
-$ WS "#ifdef IIH
-$ WS "#include <inttypes.h>
-$ WS "#endif
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
 $ WS "{"
-$ WS "fpos64_t bar;
-$ WS "exit(0);
+$ WS "fpos64_t bar;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile_ok
@@ -3265,19 +3305,19 @@ $! Check to see if int64_t exists
 $!
 $ echo4 "Checking to see if you have int64_t..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#''i_inttypes IIH
-$ WS "#ifdef IIH
-$ WS "#include <inttypes.h>
-$ WS "#endif
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
 $ WS "{"
-$ WS "int64_t bar;
-$ WS "exit(0);
+$ WS "int64_t bar;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB compile_ok
@@ -3302,16 +3342,16 @@ $! Check for h_errno
 $!
 $ echo4 "Checking to see if you have h_errno..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>
-$ IF i_netdb  .EQS. "define" THEN WS "#include <netdb.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>"
+$ IF i_netdb  .EQS. "define" THEN WS "#include <netdb.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "h_errno = 3;
-$ WS "exit(0);
+$ WS "h_errno = 3;"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB link_ok
@@ -3329,25 +3369,25 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
-$   WS "#include <types.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "#include <types.h>"
 $   IF Has_Socketshr
 $   THEN
 $     WS "#include <socketshr.h>"
 $   ELSE
-$     WS "#include <time.h>
-$     WS "#include <socket.h>
+$     WS "#include <time.h>"
+$     WS "#include <socket.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "char name[100];
-$   WS "int bar, baz;
-$   WS "bar = 100;
-$   WS "baz = gethostname(name, bar);
-$   WS "exit(0);
+$   WS "char name[100];"
+$   WS "int bar, baz;"
+$   WS "bar = 100;"
+$   WS "baz = gethostname(name, bar);"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   GOSUB link_ok
@@ -3420,15 +3460,15 @@ $!
 $! Check for fcntl
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <fcntl.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <fcntl.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "fcntl(1,2,3);
-$ WS "exit(0);
+$ WS "fcntl(1,2,3);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "fcntl"
@@ -3438,15 +3478,15 @@ $!
 $! Check for memchr
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "char * place;
-$ WS "place = memchr(""foo"", 47, 3)
-$ WS "exit(0);
+$ WS "char * place;"
+$ WS "place = memchr(""foo"", 47, 3)"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "memchr"
@@ -3456,15 +3496,15 @@ $!
 $! Check for strtoull
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "unsigned __int64 result;
-$ WS "result = strtoull(""123123"", NULL, 10);
-$ WS "exit(0);
+$ WS "unsigned __int64 result;"
+$ WS "result = strtoull(""123123"", NULL, 10);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "strtoull"
@@ -3474,15 +3514,15 @@ $!
 $! Check for strtouq
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "unsigned __int64 result;
-$ WS "result = strtouq(""123123"", NULL, 10);
-$ WS "exit(0);
+$ WS "unsigned __int64 result;"
+$ WS "result = strtouq(""123123"", NULL, 10);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "strtouq"
@@ -3492,15 +3532,15 @@ $!
 $! Check for strtoll
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "__int64 result;
-$ WS "result = strtoll(""123123"", NULL, 10);
-$ WS "exit(0);
+$ WS "__int64 result;"
+$ WS "result = strtoll(""123123"", NULL, 10);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "strtoll"
@@ -3510,15 +3550,15 @@ $!
 $! Check for strtold
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "long double result;
-$ WS "result = strtold(""123123"", NULL, 10);
-$ WS "exit(0);
+$ WS "long double result;"
+$ WS "result = strtold(""123123"", NULL, 10);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "strtold"
@@ -3528,15 +3568,15 @@ $!
 $! Check for atoll
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS " __int64 result;
-$ WS "result = atoll(""123123"");
-$ WS "exit(0);
+$ WS " __int64 result;"
+$ WS "result = atoll(""123123"");"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "atoll"
@@ -3546,15 +3586,15 @@ $!
 $! Check for atolf
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "long double
-$ WS "result = atolf(""123123"");
-$ WS "exit(0);
+$ WS "long double"
+$ WS "result = atolf(""123123"");"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "atolf"
@@ -3564,14 +3604,14 @@ $!
 $! Check for access
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "access("foo", F_OK);
-$ WS "exit(0);
+$ WS "access(""foo"", F_OK);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "acess"
@@ -3581,16 +3621,16 @@ $!
 $! Check for bzero
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <strings.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <strings.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "char foo[10];
-$ WS "bzero(foo, 10);
-$ WS "exit(0);
+$ WS "char foo[10];"
+$ WS "bzero(foo, 10);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "bzero"
@@ -3600,16 +3640,16 @@ $!
 $! Check for bcopy
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <strings.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <strings.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "char foo[10], bar[10];
-$ WS "bcopy(""foo"", bar, 3);
-$ WS "exit(0);
+$ WS "char foo[10], bar[10];"
+$ WS "bcopy(""foo"", bar, 3);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "bcopy"
@@ -3619,14 +3659,14 @@ $!
 $! Check for mkstemp
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "mkstemp(""foo"");
-$ WS "exit(0);
+$ WS "mkstemp(""foo"");"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "mkstemp"
@@ -3636,14 +3676,14 @@ $!
 $! Check for mkstemps
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "mkstemps(""foo"", 1);
-$ WS "exit(0);
+$ WS "mkstemps(""foo"", 1);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "mkstemps"
@@ -3653,18 +3693,18 @@ $!
 $! Check for iconv
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <iconv.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <iconv.h>"
+$ WS "int main()"
 $ WS "{"
 $ WS "  iconv_t cd = (iconv_t)0;"
 $ WS "  char *inbuf, *outbuf;"
 $ WS "  size_t inleft, outleft;"
 $ WS "  iconv(cd, &inbuf, &inleft, &outbuf, &outleft);"
-$ WS "exit(0);
+$ WS "  exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB link_ok
@@ -3690,14 +3730,14 @@ $!
 $! Check for mkdtemp
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "mkdtemp(""foo"");
-$ WS "exit(0);
+$ WS "mkdtemp(""foo"");"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "mkdtemp"
@@ -3707,17 +3747,17 @@ $!
 $! Check for setvbuf
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "FILE *foo;
-$ WS "char Buffer[99];
-$ WS "foo = fopen(""foo"", ""r"");
-$ WS "setvbuf(foo, Buffer, 0, 0);
-$ WS "exit(0);
+$ WS "FILE *foo;"
+$ WS "char Buffer[99];"
+$ WS "foo = fopen(""foo"", ""r"");"
+$ WS "setvbuf(foo, Buffer, 0, 0);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "setvbuf"
@@ -3727,14 +3767,14 @@ $!
 $! Check for setenv
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "setenv(""FOO"", ""BAR"", 0);
-$ WS "exit(0);
+$ WS "setenv(""FOO"", ""BAR"", 0);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "setenv"
@@ -3744,14 +3784,14 @@ $!
 $! Check for setproctitle
 $!
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "setproctitle(""%s"", ""FOO"");
-$ WS "exit(0);
+$ WS "setproctitle(""%s"", ""FOO"");"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "setproctitle"
@@ -3785,18 +3825,18 @@ $!
 $ IF Has_Dec_C_Sockets .or. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "endhostent();
-$   WS "exit(0);
+$   WS "endhostent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "endhostent"
@@ -3811,13 +3851,13 @@ $!
 $ IF Has_Dec_C_Sockets .or. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
 $   WS "int main()"
 $   WS "{"
@@ -3837,18 +3877,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "endprotoent();
-$   WS "exit(0);
+$   WS "endprotoent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "endprotoent"
@@ -3863,18 +3903,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "endservent();
-$   WS "exit(0);
+$   WS "endservent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "endservent"
@@ -3889,18 +3929,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "sethostent(1);
-$   WS "exit(0);
+$   WS "sethostent(1);"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "sethostent"
@@ -3915,18 +3955,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "setnetent(1);
-$   WS "exit(0);
+$   WS "setnetent(1);"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "setnetent"
@@ -3941,18 +3981,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "setprotoent(1);
-$   WS "exit(0);
+$   WS "setprotoent(1);"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "setprotoent"
@@ -3967,18 +4007,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "setservent(1);
-$   WS "exit(0);
+$   WS "setservent(1);"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "setservent"
@@ -3993,18 +4033,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "gethostent();
-$   WS "exit(0);
+$   WS "gethostent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "gethostent"
@@ -4019,18 +4059,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "getnetent();
-$   WS "exit(0);
+$   WS "getnetent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "getnetent"
@@ -4045,18 +4085,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "getprotoent();
-$   WS "exit(0);
+$   WS "getprotoent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "getprotoent"
@@ -4071,18 +4111,18 @@ $!
 $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "getservent();
-$   WS "exit(0);
+$   WS "getservent();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "getservent"
@@ -4098,18 +4138,18 @@ $ IF Has_Dec_C_Sockets .OR. Has_Socketshr
 $ THEN
 $   echo4 "Checking to see if you have socklen_t..."
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
 $   IF Has_Socketshr
 $   THEN WS "#include <socketshr.h>"
-$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
 $   ENDIF
-$   WS "int main()
+$   WS "int main()"
 $   WS "{"
-$   WS "socklen_t x = 16;
-$   WS "exit(0);
+$   WS "socklen_t x = 16;"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   GOSUB link_ok
@@ -4130,15 +4170,15 @@ $!
 $ IF use_threads
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <pthread.h>
-$   WS "#include <stdio.h>
-$   WS "int main()
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <pthread.h>"
+$   WS "#include <stdio.h>"
+$   WS "int main()"
 $   WS "{"
-$   WS "pthread_yield();
-$   WS "exit(0);
+$   WS "pthread_yield();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "pthread_yield"
@@ -4153,15 +4193,15 @@ $!
 $ IF use_threads
 $ THEN
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <pthread.h>
-$   WS "#include <stdio.h>
-$   WS "int main()
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <pthread.h>"
+$   WS "#include <stdio.h>"
+$   WS "int main()"
 $   WS "{"
-$   WS "sched_yield();
-$   WS "exit(0);
+$   WS "sched_yield();"
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   tmp = "sched_yield"
@@ -4180,16 +4220,16 @@ $! Check for generic pointer size
 $!
 $ echo4 "Checking to see how big your pointers are..." 
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
-$ WS "int foo;
-$ WS "foo = sizeof(char *);
-$ WS "printf(""%d\n"", foo);
-$ WS "exit(0);
+$ WS "int foo;"
+$ WS "foo = sizeof(char *);"
+$ WS "printf(""%d\n"", foo);"
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ tmp = "char *"
@@ -4210,14 +4250,14 @@ $! Check rand48 and its ilk
 $!
 $ echo4 "Looking for a random number function..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
 $ WS "{"
 $ WS "srand48(12L);"
-$ WS "exit(0);
+$ WS "exit(0);"
 $ WS "}"
 $ CS
 $ GOSUB link_ok
@@ -4234,14 +4274,14 @@ $   drand01="random()"
 $   randseedtype = "unsigned"
 $   seedfunc = "srandom"
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
-$   WS "int main()
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "int main()"
 $   WS "{"
 $   WS "srandom(12);"
-$   WS "exit(0);
+$   WS "exit(0);"
 $   WS "}"
 $   CS
 $   GOSUB link_ok
@@ -4255,7 +4295,6 @@ $     seedfunc = "srand"
 $     echo4 "Yick, looks like I have to use rand()."
 $   ENDIF
 $ ENDIF
-$!
 $! Done with compiler checks. Clean up.
 $ IF F$SEARCH("try.c")  .NES."" THEN DELETE/NOLOG/NOCONFIRM try.c;*
 $ IF F$SEARCH("try.obj").NES."" THEN DELETE/NOLOG/NOCONFIRM try.obj;*
@@ -4295,7 +4334,7 @@ $   psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"","
 $   psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",""SPARE18"",""SPARE19"",""CHLD"",""CONT"",""STOP"",""TSTP"","
 $   psnwc3="""TTIN"",""TTOU"",""DEBUG"",""SPARE27"",""SPARE28"",""SPARE29"",""SPARE30"",""SPARE31"",""SPARE32"",""RTMIN"",""RTMAX"",0"
 $   sig_name_init = psnwc1 + psnwc2 + psnwc3
-$   sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 64"","0"
+$   sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 64"",0"
 $   sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,64,0"
 $!   perl_sig_num_with_commas=sig_num_init
 $   uidtype="uid_t"
@@ -4386,7 +4425,7 @@ $   d_gethostprotos="define"
 $   d_getnetprotos="define"
 $   d_getprotoprotos="define"
 $   d_getservprotos="define"
-$   IF Using_Dec_C
+$   IF Using_Dec_C .OR. using_cxx
 $   THEN
 $     socksizetype="unsigned int"
 $   ELSE
@@ -4468,20 +4507,20 @@ $   tmp = "long"
 $   GOSUB type_size_check
 $   longsize = tmp
 $ ENDIF
-$
+$!
 $ tmp = "''uvtype'"
 $ GOSUB type_size_check
 $ uvsize = tmp
 $ IF use64bitint .OR. use64bitint .EQS. "define" THEN u64size = tmp
-$
+$!
 $ tmp = "''i8type'"
 $ GOSUB type_size_check
 $ i8size = tmp
-$
+$!
 $ tmp = "''u8type'"
 $ GOSUB type_size_check
 $ u8size = tmp
-$
+$!
 $ tmp = "''i16type'"
 $ GOSUB type_size_check
 $ i16size = tmp
@@ -4492,11 +4531,11 @@ $   tmp = "short"
 $   gosub type_size_check
 $   shortsize = tmp
 $ ENDIF
-$
+$!
 $ tmp = "''u16type'"
 $ GOSUB type_size_check
 $ u16size = tmp
-$
+$!
 $ tmp = "''i32type'"
 $ GOSUB type_size_check
 $ i32size = tmp
@@ -4507,11 +4546,11 @@ $   tmp = "int"
 $   gosub type_size_check
 $   intsize = tmp
 $ ENDIF
-$
+$!
 $ tmp = "''u32type'"
 $ gosub type_size_check
 $ u32size = tmp
-$
+$!
 $ tmp = "''nvtype'"
 $ GOSUB type_size_check
 $ nvsize = tmp
@@ -4522,20 +4561,20 @@ $ echo "(NV will be ""''nvtype'"", ''nvsize' bytes)"
 $!
 $ echo4 "Checking whether your NVs can preserve your UVs..."
 $ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main() {
-$ WS "    ''uvtype' k = (''uvtype')~0, l;
-$ WS "    ''nvtype' d;
-$ WS "    l = k;
-$ WS "    d = (''nvtype')l;
-$ WS "    l = (''uvtype')d;
-$ WS "    if (l == k)
-$ WS "       printf(""preserve\n"");
-$ WS "    exit(0);
-$ WS "}
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main() {"
+$ WS "    ''uvtype' k = (''uvtype')~0, l;"
+$ WS "    ''nvtype' d;"
+$ WS "    l = k;"
+$ WS "    d = (''nvtype')l;"
+$ WS "    l = (''uvtype')d;"
+$ WS "    if (l == k)"
+$ WS "       printf(""preserve\n"");"
+$ WS "    exit(0);"
+$ WS "}"
 $ CS
 $ GOSUB compile
 $ IF tmp .EQS. "preserve"
@@ -4548,22 +4587,22 @@ $   d_nv_preserves_uv = "undef"
 $   echo "No, they can't."
 $   echo4 "Checking how many bits of your UVs your NVs can preserve..."
 $   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
-$   WS "int main() {
-$   WS "    ''uvtype' u = 0;
-$   WS "    int     n = 8 * ''uvsize';
-$   WS "    int     i;
-$   WS "    for (i = 0; i < n; i++) {
-$   WS "      u = u << 1 | (''uvtype')1;
-$   WS "      if ((''uvtype')(''nvtype')u != u)
-$   WS "        break;
-$   WS "    }
-$   WS "    printf(""%d\n"", i);
-$   WS "    exit(0);
-$   WS "}
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "int main() {"
+$   WS "    ''uvtype' u = 0;"
+$   WS "    int     n = 8 * ''uvsize';"
+$   WS "    int     i;"
+$   WS "    for (i = 0; i < n; i++) {"
+$   WS "      u = u << 1 | (''uvtype')1;"
+$   WS "      if ((''uvtype')(''nvtype')u != u)"
+$   WS "        break;"
+$   WS "    }"
+$   WS "    printf(""%d\n"", i);"
+$   WS "    exit(0);"
+$   WS "}"
 $   GOSUB compile
 $   d_nv_preserves_uv_bits = tmp
 $ ENDIF
@@ -4582,10 +4621,16 @@ $! Finally the composite ones. All config
 $!
 $ myuname="''osname' ''myname' ''osvers' ''F$EDIT(hwname, "TRIM")'"
 $!
-$ IF Using_Dec_C
+$ IF Using_Dec_C .AND. (.NOT. using_cxx)
 $ THEN
 $   ccflags="/Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=''obj_ext'/NoList''ccflags'"
 $ ENDIF
+$ i_dirent = "undef"
+$ IF using_cxx
+$ THEN
+$   i_dirent = "define"
+$   ccflags="/Include=[]/Standard=ANSI/Prefix=All/Obj=''obj_ext'/NoList''ccflags'"
+$ ENDIF
 $ IF use_vmsdebug_perl
 $ THEN
 $   optimize="/Debug/NoOpt"
@@ -4598,7 +4643,7 @@ $!
 $! Okay, we've got everything configured. Now go write out a config.sh.
 $ basename_config_sh = F$PARSE(config_sh,,,"NAME",)+F$PARSE(config_sh,,,"TYPE",)
 $ echo4 "Creating ''basename_config_sh'..."
-$ open/write CONFIG 'config_sh
+$ open/write CONFIG 'config_sh'
 $ WC := write CONFIG
 $!
 $! ##BEGIN WRITE NEW CONSTANTS HERE##
@@ -4634,7 +4679,7 @@ $ WC "cc='" + perl_cc + "'"
 $ WC "cccdlflags='" + cccdlflags + "'"
 $ WC "ccdlflags='" + ccdlflags + "'"
 $ WC "ccflags='" + ccflags + "'"
-$ WC "ccversion='" + ccversion + "'" ! VMS specific, oddly enough
+$ WC "ccversion='" + ccversion + "'"
 $ WC "cf_by='" + cf_by + "'"
 $ WC "cf_email='" + cf_email + "'"
 $ WC "cf_time='" + cf_time + "'"
@@ -4978,7 +5023,7 @@ $ WC "i8size='" + i8size + "'"
 $ WC "i8type='" + i8type + "'"
 $ WC "i_arpainet='undef'"
 $ WC "i_dbm='undef'"
-$ WC "i_dirent='undef'"
+$ WC "i_dirent='" + i_dirent + "'"
 $ WC "i_dlfcn='undef'"
 $ WC "i_fcntl='" + i_fcntl + "'"
 $ WC "i_float='define'"
@@ -5227,7 +5272,7 @@ $ CLOSE CONFIG
 $!
 $! Okay, we've gotten here. Build munchconfig.exe
 $ COPY/NOLOG [-.vms]munchconfig.c []
-$ COPY/NOLOG [-.vms]'Makefile_SH []
+$ COPY/NOLOG [-.vms]'Makefile_SH' []
 $ 'Perl_CC' munchconfig.c
 $ IF Needs_Opt
 $ THEN
@@ -5253,10 +5298,12 @@ $!
 $ IF alldone .EQS. ""
 $ THEN
 $   cat4 SYS$INPUT:
+$   DECK
 
 If you'd like to make any changes to the config.sh file before I begin
 to configure things, answer yes to the following question.
 
+$   EOD
 $   dflt="n"
 $   rp="Do you wish to edit ''basename_config_sh'? [''dflt'] "
 $   GOSUB myread
@@ -5268,10 +5315,10 @@ $     echo4 "Be sure to type LOGOUT after you have edited the file,"
 $     echo4 "then this procedure will resume."
 $     echo4 ""
 $     default = F$ENVIRONMENT("DEFAULT")
-$     DIRECTORY 'config_sh
+$     DIRECTORY 'config_sh'
 $     SET DEFAULT [-]
 $     SPAWN/WAIT
-$     SET DEFAULT 'default
+$     SET DEFAULT 'default'
 $   ENDIF
 $ ENDIF
 $!
@@ -5280,8 +5327,10 @@ $ echo4 "Adding ''osname' specific preprocessor commands."
 $ !
 $ ! we need an fdl file
 $ CREATE [-]CONFIG.FDL
+$ DECK
 RECORD
   FORMAT STREAM_LF
+$ EOD
 $ CREATE /FDL=[-]CONFIG.FDL [-]CONFIG.LOCAL
 $ ! First spit out the header info with the local defines (to get
 $ ! around the 255 character command line limit)
@@ -5321,7 +5370,7 @@ $ echo4 "Extracting config.h (with variable substitutions)"
 $!
 $! Now build the normal config.h
 $ DEFINE/USER_MODE sys$output [-]config.main
-$ mcr []munchconfig 'config_sh [-]config_h.sh
+$ mcr []munchconfig 'config_sh' [-]config_h.sh
 $ ! Concatenate them together
 $ copy [-]config.local,[-]config.main [-]config.h
 $! Clean up
@@ -5333,7 +5382,13 @@ $ IF Using_Dec_C
 $ THEN
 $   DECC_REPLACE = "DECC=decc=1"
 $ ELSE
-$   DECC_REPLACE = "DECC=" 
+$   DECC_REPLACE = "DECC="
+$ ENDIF
+$ IF using_cxx
+$ THEN
+$   DECCXX_REPLACE = "DECCXX=DECCXX=1"
+$ ELSE
+$   DECCXX_REPLACE = "DECCXX="
 $ ENDIF
 $ IF Using_Gnu_C
 $ THEN
@@ -5370,13 +5425,17 @@ $ ELSE
 $   MALLOC_REPLACE = "MALLOC="
 $ ENDIF
 $ echo4 "Extracting ''defmakefile' (with variable substitutions)"
-$ DEFINE/USER_MODE sys$output 'UUmakefile 
-$ mcr []munchconfig 'config_sh 'Makefile_SH "''DECC_REPLACE'" "''ARCH_TYPE'" "''GNUC_REPLACE'" "''SOCKET_REPLACE'" "''THREAD_REPLACE'" -
-"''C_Compiler_Replace'" "''MALLOC_REPLACE'" "''Thread_Live_Dangerously'" "PV=''version'" "FLAGS=FLAGS=''extra_flags'"
-$ echo4 "Extracting Build_Ext.Com (without variable substitutions)"
-$ Create Sys$Disk:[-]Build_Ext.Com
+$ DEFINE/USER_MODE sys$output 'UUmakefile'
+$ mcr []munchconfig 'config_sh' 'Makefile_SH' "''DECC_REPLACE'" -
+ "''DECCXX_REPLACE'" "''ARCH_TYPE'" "''GNUC_REPLACE'" "''SOCKET_REPLACE'" -
+ "''THREAD_REPLACE'" "''C_Compiler_Replace'" "''MALLOC_REPLACE'" -
+ "''Thread_Live_Dangerously'" "PV=''version'" "FLAGS=FLAGS=''extra_flags'"
+$! Clean up after ourselves
+$ DELETE/NOLOG/NOCONFIRM []munchconfig.exe;
+$ echo4 "Extracting make_ext.com (without variable substitutions)"
+$ Create Sys$Disk:[-]make_ext.com
 $ Deck/Dollar="$EndOfTpl$"
-$!++ Build_Ext.Com
+$!++ make_ext.com
 $!   NOTE: This file is extracted as part of the VMS configuration process.
 $!   Any changes made to it directly will be lost.  If you need to make any
 $!   changes, please edit the template in Configure.Com instead.
@@ -5394,17 +5453,20 @@ $    ext = F$Element(i," ",p1)
 $    If ext .eqs. " " Then Goto done
 $    Define/User_mode Perl_Env_Tables CLISYM_LOCAL
 $    miniperl
+$    deck
      ($extdir = $ENV{'ext'}) =~ s/::/./g;
      $extdir =~ s#/#.#g;
      if ($extdir =~ /^vms/i) { $extdir =~ s/vms/.vms.ext/i; }
      else                    { $extdir = ".ext.$extdir";   }
      ($ENV{'extdir'} = "[$extdir]");
      ($ENV{'up'} = ('-') x ($extdir =~ tr/././));
+$    eod
 $    Set Default &extdir
 $    redesc = 0
 $    If F$Locate("clean",targ) .eqs. F$Length(targ)
 $    Then
-$      Write Sys$Output "Building ''ext' . . ."
+$      Write Sys$Output ""
+$      Write Sys$Output "      Making ''ext' (dynamic)"
 $      On Error Then Goto done
 $      If F$Search("Descrip.MMS") .eqs. ""
 $      Then
@@ -5427,11 +5489,9 @@ $ done:
 $    sts = $Status
 $    Set Def &def
 $    Exit sts
-$!-- Build_Ext.Com
+$!-- make_ext.com
 $EndOfTpl$
 $!
-$! Clean up after ourselves
-$ DELETE/NOLOG/NOCONFIRM []munchconfig.exe;
 $!
 $!  Warn of dangerous symbols or logical names
 $!
@@ -5439,7 +5499,7 @@ $Bad_environment: SUBROUTINE
 $   Bad_env = ""
 $   IF p2 .eqs. "SYMBOL"
 $   THEN
-$     IF f$type('p1) .nes. "" THEN  Bad_env := SYMBOL
+$     IF f$type('p1') .nes. "" THEN  Bad_env := SYMBOL
 $   ELSE
 $     IF f$trnlnm(p1) .nes. "" THEN Bad_env := LOGICAL
 $   ENDIF
@@ -5459,7 +5519,7 @@ $       WRITE CONFIG " delete before building ''package' via:"
 $       WRITE CONFIG "     $ DELETE/SYMBOL/GLOBAL ''p1'"
 $       IF f$locate("""",&p1) .ge. f$length(&p1)
 $       THEN
-$       WRITE CONFIG " after building, testing, and installing ''package'
+$       WRITE CONFIG " after building, testing, and installing ''package'"
 $       WRITE CONFIG " restore the symbol with:"
 $       WRITE CONFIG "     $ ''p1' == """ + &p1 + """"
 $       ENDIF
@@ -5615,7 +5675,7 @@ $ echo  ""
 $ IF ((.NOT.perl_symbol) .AND. (perl_verb .EQS. "DCLTABLES"))
 $ THEN
 $   file_2_find = "[-]''packageup'_install.com"
-$   OPEN/WRITE CONFIG 'file_2_find
+$   OPEN/WRITE CONFIG 'file_2_find'
 $   WRITE CONFIG "$ set command perl /table=sys$common:[syslib]dcltables.exe -"
 $   WRITE CONFIG "    /output=sys$common:[syslib]dcltables.exe"
 $   WRITE CONFIG "$ install replace sys$common:[syslib]dcltables.exe"
diff --git a/cop.h b/cop.h
index 5b47884..6e8bd91 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -433,6 +433,7 @@ L<perlcall>.
 #define EVAL_INEVAL    1       /* some enclosing scope is an eval */
 #define EVAL_WARNONLY  2       /* used by yywarn() when calling yyerror() */
 #define EVAL_KEEPERR   4       /* set by Perl_call_sv if G_KEEPERR */
+#define EVAL_INREQUIRE 8       /* The code is being required. */
 
 /* Support for switching (stack and block) contexts.
  * This ensures magic doesn't invalidate local stack and cx pointers.
diff --git a/doio.c b/doio.c
index ceb8321..de613f4 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -320,7 +320,16 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
                             * fsetpos(src)+fgetpos(dst)?  --nik */
                            PerlIO_flush(fp);
                            fd = PerlIO_fileno(fp);
-                           if (IoTYPE(thatio) == IoTYPE_SOCKET)
+                           /* When dup()ing STDIN, STDOUT or STDERR
+                            * explicitly set appropriate access mode */
+                           if (IoIFP(thatio) == PerlIO_stdout()
+                               || IoIFP(thatio) == PerlIO_stderr())
+                               IoTYPE(io) = IoTYPE_WRONLY;
+                           else if (IoIFP(thatio) == PerlIO_stdin())
+                                IoTYPE(io) = IoTYPE_RDONLY;
+                           /* When dup()ing a socket, say result is
+                            * one as well */
+                           else if (IoTYPE(thatio) == IoTYPE_SOCKET)
                                IoTYPE(io) = IoTYPE_SOCKET;
                        }
                        else
@@ -450,7 +459,9 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
 #else
            !PL_statbuf.st_mode
 #endif
-       ) {
+           && IoTYPE(io) != IoTYPE_WRONLY  /* Dups of STD* filehandles already have */
+           && IoTYPE(io) != IoTYPE_RDONLY  /* type so they aren't marked as sockets */
+       ) {                                 /* on OS's that return 0 on fstat()ed pipe */
            char tmpbuf[256];
            Sock_size_t buflen = sizeof tmpbuf;
            if (PerlSock_getsockname(PerlIO_fileno(fp), (struct sockaddr *)tmpbuf,
diff --git a/doop.c b/doop.c
index 69b3e89..6f6d78f 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -75,12 +75,12 @@ S_do_trans_simple(pTHX_ SV *sv)
 
         ulen = 1;
         /* Need to check this, otherwise 128..255 won't match */
-       c = utf8_to_uv(s, &ulen);
+       c = utf8_to_uv_chk(s, &ulen, 0);
         if (c < 0x100 && (ch = tbl[(short)c]) >= 0) {
             matches++;
-            if (ch < 0x80) 
+            if (ch < 0x80)
                 *d++ = ch;
-            else         
+            else
                 d = uv_to_utf8(d,ch);
             s += ulen;
         }
@@ -123,7 +123,7 @@ S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
             I32 ulen;
             ulen = 1;
             if (hasutf)
-                c = utf8_to_uv(s,&ulen);
+                c = utf8_to_uv_chk(s,&ulen, 0);
             else
                 c = *s;
             if (c < 0x100 && tbl[c] >= 0)
@@ -220,7 +220,7 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
     UV extra = none + 1;
     UV final;
     UV uv;
-    I32 isutf; 
+    I32 isutf;
     I32 howmany;
 
     isutf = SvUTF8(sv);
@@ -256,7 +256,7 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
            i = UTF8SKIP(s);
            s += i;
            matches++;
-            if (i > 1 && !isutf++) 
+            if (i > 1 && !isutf++)
                 HALF_UTF8_UPGRADE(dstart,d);
            d = uv_to_utf8(d, final);
        }
@@ -335,7 +335,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
     if (squash) {
        UV puv = 0xfeedface;
        while (s < send) {
-            if (SvUTF8(sv)) 
+            if (SvUTF8(sv))
                uv = swash_fetch(rv, s);
            else {
                U8 tmpbuf[2];
@@ -352,7 +352,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            if (uv < none) {
                matches++;
                if (uv != puv) {
-                    if ((uv & 0x80) && !isutf++) 
+                    if ((uv & 0x80) && !isutf++)
                         HALF_UTF8_UPGRADE(dst,d);
                    d = uv_to_utf8(d, uv);
                    puv = uv;
@@ -362,7 +362,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            }
            else if (uv == none) {      /* "none" is unmapped character */
                I32 ulen;
-               *d++ = (U8)utf8_to_uv(s, &ulen);
+               *d++ = (U8)utf8_to_uv_chk(s, &ulen, 0);
                s += ulen;
                puv = 0xfeedface;
                continue;
@@ -382,7 +382,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
     }
     else {
        while (s < send) {
-            if (SvUTF8(sv)) 
+            if (SvUTF8(sv))
                uv = swash_fetch(rv, s);
            else {
                U8 tmpbuf[2];
@@ -403,7 +403,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            }
            else if (uv == none) {      /* "none" is unmapped character */
                I32 ulen;
-               *d++ = (U8)utf8_to_uv(s, &ulen);
+               *d++ = (U8)utf8_to_uv_chk(s, &ulen, 0);
                s += ulen;
                continue;
            }
@@ -433,7 +433,7 @@ Perl_do_trans(pTHX_ SV *sv)
 {
     dTHR;
     STRLEN len;
-    I32 hasutf = (PL_op->op_private & 
+    I32 hasutf = (PL_op->op_private &
                     (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
 
     if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
@@ -545,7 +545,7 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
 
     if (offset < 0)
        return retnum;
-    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */ 
+    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
        Perl_croak(aTHX_ "Illegal number of bits in vec");
 
     if (SvUTF8(sv)) {
@@ -623,7 +623,7 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
                        ((UV) s[offset + 4] << 24) +
                        ((UV) s[offset + 5] << 16);
                else
-                   retnum = 
+                   retnum =
                        ((UV) s[offset    ] << 56) +
                        ((UV) s[offset + 1] << 48) +
                        ((UV) s[offset + 2] << 40) +
@@ -706,9 +706,9 @@ Perl_do_vecset(pTHX_ SV *sv)
     if (offset < 0)
        Perl_croak(aTHX_ "Assigning to negative offset in vec");
     size = LvTARGLEN(sv);
-    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */ 
+    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
        Perl_croak(aTHX_ "Illegal number of bits in vec");
-    
+
     offset *= size;                    /* turn into bit offset */
     len = (offset + size + 7) / 8;     /* required number of bytes */
     if (len > targlen) {
@@ -716,7 +716,7 @@ Perl_do_vecset(pTHX_ SV *sv)
        (void)memzero(s + targlen, len - targlen + 1);
        SvCUR_set(targ, len);
     }
-    
+
     if (size < 8) {
        mask = (1 << size) - 1;
        size = offset & 7;
@@ -765,7 +765,7 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
     STRLEN len;
     char *s;
     dTHR;
-    
+
     if (SvTYPE(sv) == SVt_PVAV) {
        register I32 i;
         I32 max;
@@ -899,7 +899,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
   nope:
     SvSETMAGIC(sv);
     return count;
-} 
+}
 
 void
 Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
@@ -967,10 +967,10 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
        switch (optype) {
        case OP_BIT_AND:
            while (lulen && rulen) {
-               luc = utf8_to_uv((U8*)lc, &ulen);
+               luc = utf8_to_uv_chk((U8*)lc, &ulen, 0);
                lc += ulen;
                lulen -= ulen;
-               ruc = utf8_to_uv((U8*)rc, &ulen);
+               ruc = utf8_to_uv_chk((U8*)rc, &ulen, 0);
                rc += ulen;
                rulen -= ulen;
                duc = luc & ruc;
@@ -982,10 +982,10 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
            break;
        case OP_BIT_XOR:
            while (lulen && rulen) {
-               luc = utf8_to_uv((U8*)lc, &ulen);
+               luc = utf8_to_uv_chk((U8*)lc, &ulen, 0);
                lc += ulen;
                lulen -= ulen;
-               ruc = utf8_to_uv((U8*)rc, &ulen);
+               ruc = utf8_to_uv_chk((U8*)rc, &ulen, 0);
                rc += ulen;
                rulen -= ulen;
                duc = luc ^ ruc;
@@ -994,10 +994,10 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
            goto mop_up_utf;
        case OP_BIT_OR:
            while (lulen && rulen) {
-               luc = utf8_to_uv((U8*)lc, &ulen);
+               luc = utf8_to_uv_chk((U8*)lc, &ulen, 0);
                lc += ulen;
                lulen -= ulen;
-               ruc = utf8_to_uv((U8*)rc, &ulen);
+               ruc = utf8_to_uv_chk((U8*)rc, &ulen, 0);
                rc += ulen;
                rulen -= ulen;
                duc = luc | ruc;
@@ -1105,8 +1105,8 @@ Perl_do_kv(pTHX)
     I32 dokeys =   (PL_op->op_type == OP_KEYS);
     I32 dovalues = (PL_op->op_type == OP_VALUES);
     I32 realhv = (SvTYPE(hv) == SVt_PVHV);
-    
-    if (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV) 
+
+    if (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV)
        dokeys = dovalues = TRUE;
 
     if (!hv) {
diff --git a/embed.h b/embed.h
index ced6e9d..e99743f 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define utf8_to_bytes          Perl_utf8_to_bytes
 #define bytes_to_utf8          Perl_bytes_to_utf8
 #define utf8_to_uv             Perl_utf8_to_uv
+#define utf8_to_uv_chk         Perl_utf8_to_uv_chk
 #define uv_to_utf8             Perl_uv_to_utf8
 #define vivify_defelem         Perl_vivify_defelem
 #define vivify_ref             Perl_vivify_ref
 #define ck_spair               Perl_ck_spair
 #define ck_split               Perl_ck_split
 #define ck_subr                        Perl_ck_subr
+#define ck_substr              Perl_ck_substr
 #define ck_svconst             Perl_ck_svconst
 #define ck_trunc               Perl_ck_trunc
 #define pp_aassign             Perl_pp_aassign
 #define utf8_to_bytes(a,b)     Perl_utf8_to_bytes(aTHX_ a,b)
 #define bytes_to_utf8(a,b)     Perl_bytes_to_utf8(aTHX_ a,b)
 #define utf8_to_uv(a,b)                Perl_utf8_to_uv(aTHX_ a,b)
+#define utf8_to_uv_chk(a,b,c)  Perl_utf8_to_uv_chk(aTHX_ a,b,c)
 #define uv_to_utf8(a,b)                Perl_uv_to_utf8(aTHX_ a,b)
 #define vivify_defelem(a)      Perl_vivify_defelem(aTHX_ a)
 #define vivify_ref(a,b)                Perl_vivify_ref(aTHX_ a,b)
 #define ck_spair(a)            Perl_ck_spair(aTHX_ a)
 #define ck_split(a)            Perl_ck_split(aTHX_ a)
 #define ck_subr(a)             Perl_ck_subr(aTHX_ a)
+#define ck_substr(a)           Perl_ck_substr(aTHX_ a)
 #define ck_svconst(a)          Perl_ck_svconst(aTHX_ a)
 #define ck_trunc(a)            Perl_ck_trunc(aTHX_ a)
 #define pp_aassign()           Perl_pp_aassign(aTHX)
 #define bytes_to_utf8          Perl_bytes_to_utf8
 #define Perl_utf8_to_uv                CPerlObj::Perl_utf8_to_uv
 #define utf8_to_uv             Perl_utf8_to_uv
+#define Perl_utf8_to_uv_chk    CPerlObj::Perl_utf8_to_uv_chk
+#define utf8_to_uv_chk         Perl_utf8_to_uv_chk
 #define Perl_uv_to_utf8                CPerlObj::Perl_uv_to_utf8
 #define uv_to_utf8             Perl_uv_to_utf8
 #define Perl_vivify_defelem    CPerlObj::Perl_vivify_defelem
 #define ck_split               Perl_ck_split
 #define Perl_ck_subr           CPerlObj::Perl_ck_subr
 #define ck_subr                        Perl_ck_subr
+#define Perl_ck_substr         CPerlObj::Perl_ck_substr
+#define ck_substr              Perl_ck_substr
 #define Perl_ck_svconst                CPerlObj::Perl_ck_svconst
 #define ck_svconst             Perl_ck_svconst
 #define Perl_ck_trunc          CPerlObj::Perl_ck_trunc
index b99a59f..bce4243 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -1428,7 +1428,7 @@ Afnrp     |void   |croak_nocontext|const char* pat|...
 Afnp   |OP*    |die_nocontext  |const char* pat|...
 Afnp   |void   |deb_nocontext  |const char* pat|...
 Afnp   |char*  |form_nocontext |const char* pat|...
-Afnp   |void   |load_module_nocontext|U32 flags|SV* name|SV* ver|...
+Anp    |void   |load_module_nocontext|U32 flags|SV* name|SV* ver|...
 Afnp   |SV*    |mess_nocontext |const char* pat|...
 Afnp   |void   |warn_nocontext |const char* pat|...
 Afnp   |void   |warner_nocontext|U32 err|const char* pat|...
@@ -1651,7 +1651,7 @@ p |void   |lex_start      |SV* line
 p      |OP*    |linklist       |OP* o
 p      |OP*    |list           |OP* o
 p      |OP*    |listkids       |OP* o
-Afp    |void   |load_module|U32 flags|SV* name|SV* ver|...
+A    |void   |load_module|U32 flags|SV* name|SV* ver|...
 Ap     |void   |vload_module|U32 flags|SV* name|SV* ver|va_list* args
 p      |OP*    |localize       |OP* arg|I32 lexical
 Apd    |I32    |looks_like_number|SV* sv
@@ -2074,6 +2074,7 @@ Ap        |U8*    |utf8_hop       |U8 *s|I32 off
 ApM    |U8*    |utf8_to_bytes  |U8 *s|STRLEN *len
 ApM    |U8*    |bytes_to_utf8  |U8 *s|STRLEN *len
 Ap     |UV     |utf8_to_uv     |U8 *s|I32* retlen
+Ap     |UV     |utf8_to_uv_chk |U8 *s|I32* retlen|bool checking
 Ap     |U8*    |uv_to_utf8     |U8 *d|UV uv
 p      |void   |vivify_defelem |SV* sv
 p      |void   |vivify_ref     |SV* sv|U32 to_what
index af89237..2687a77 100644 (file)
@@ -32,8 +32,8 @@ apirevision=''
 apisubversion=''
 apiversion=''
 ar='arm-pe-ar'
-archlib='/perl/lib/5.7.0/epoc'
-archlibexp='/perl/lib/5.7.0/epoc'
+archlib='?:/perl/lib/5.7.0/epoc'
+archlibexp='?:/perl/lib/5.7.0/epoc'
 archname64=''
 archname='epoc'
 archobjs='epoc.o epocish.o epoc_stubs.o'
@@ -386,7 +386,7 @@ emacs=''
 eunicefix=':'
 exe_ext=''
 expr='expr'
-extensions='Data/Dumper File/Glob IO Socket Fcntl'
+extensions='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname Errno'
 fflushNULL='undef'
 fflushall='define'
 find=''
@@ -484,21 +484,21 @@ i_vfork='undef'
 ignore_versioned_solibs=''
 incpath=''
 inews=''
-installarchlib='/home/olaf/E/lib'
-installbin='/home/olaf/E/bin'
-installman1dir=''
-installman3dir=''
-installprefix='/home/olaf/'
+installarchlib='/home/of/PERL/perl/lib/5.6.0/epoc'
+installbin='/home/of/PERL/System/Programs/'
+installman1dir='/home/of/PERL/man1'
+installman3dir='/home/of/PERL/man3'
+installprefix=''
 installprefixexp=''
-installprivlib=''
-installscript=''
-installsitearch='/home/olaf/E/site/'
-installsitelib='/home/olaf/E/site/lib'
+installprivlib='/home/of/PERL/perl/lib/5.6.0/'
+installscript='/home/of/PERL/bin/'
+installsitearch='/home/of/PERL/site/lib/site_perl/5.6.0/epoc'
+installsitelib='/home/of/PERL/perl/lib/site_perl/5.6.0'
 installstyle=''
 installusrbinperl='undef'
 installvendorlib=''
 intsize='4'
-known_extensions='Data/Dumper File/Glob IO Socket Fcntl'
+known_extensions='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname Errno'
 ksh=''
 ld='echo'
 lddlflags=''
@@ -559,7 +559,7 @@ netdb_net_type='int'
 nm='arm-pe-nm'
 nm_opt=''
 nm_so_opt=''
-nonxs_ext=''
+nonxs_ext='Errno'
 nroff='nroff'
 o_nonblock='O_NONBLOCK'
 obj_ext=''
@@ -573,7 +573,7 @@ package=''
 pager=''
 passcat=''
 patchlevel=''
-path_sep=''
+path_sep=':'
 perl=''
 perladmin=''
 perlpath=''
@@ -585,8 +585,8 @@ pmake=''
 pr=''
 prefix=''
 prefixexp=''
-privlib='/perl/lib/5.7.0'
-privlibexp='/perl/lib/5.7.0'
+privlib='?:/perl/lib/5.7.0'
+privlibexp='?:/perl/lib/5.7.0'
 prototype='define'
 ptrsize='4'
 randbits='31'
@@ -630,11 +630,11 @@ sig_name_init='"ZERO", 0'
 sig_num='0'
 sig_num_init='0, 0'
 signal_t='void'
-sitearch='/perl/lib/site_perl/5.7.0/epoc'
-sitearchexp='/perl/lib/site_perl/5.7.0/epoc'
-sitelib='/perl/lib/site_perl/5.7.0/'
-sitelib_stem='/perl/lib/site_perl'
-sitelibexp='/perl/lib/site_perl/5.7.0/'
+sitearch='?:/perl/lib/site_perl/5.7.0/epoc'
+sitearchexp='?:/perl/lib/site_perl/5.7.0/epoc'
+sitelib='?:/perl/lib/site_perl/5.7.0/'
+sitelib_stem='?:/perl/lib/site_perl'
+sitelibexp='?:/perl/lib/site_perl/5.7.0/'
 siteprefix=''
 siteprefixexp=''
 sizesize='4'
@@ -652,7 +652,7 @@ src='.'
 ssizetype='long'
 startperl=''
 startsh='#!/bin/sh'
-static_ext='Data/Dumper File/Glob IO Socket Fcntl'
+static_ext='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname'
 stdchar='char'
 stdio_base=''
 stdio_bufsiz=''
@@ -705,6 +705,7 @@ vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
 version='5.7.0'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth=''
@@ -945,4 +946,16 @@ xs_apiversion='5.005'
 d_getcwd='define'
 i_sysmode='undef'
 d_vendorarch='undef'
-
+d_frexpl='undef'
+d_getespwnam='undef'
+d_getprpwnam='undef'
+d_isnan='define'
+d_isnanl='undef'
+d_modfl='undef'
+d_setproctitle='undef'
+d_socks5_init='undef'
+i_libutil='undef'
+i_prot='undef'
+d_SCNfldbl='undef'
+d_perl_otherlibdirs='undef'
+nvsize='16'
index 77dafb1..65a881f 100644 (file)
@@ -3,9 +3,9 @@
 use File::Find;
 use Cwd;
 
-$VERSION="5.6";
+$VERSION="5.7";
 $PATCH="0";
-$EPOC_VERSION=20;
+$EPOC_VERSION=24;
 $CROSSCOMPILEPATH=cwd;
 $CROSSREPLACEPATH="H:\\perl";
 
@@ -32,7 +32,7 @@ open OUT,">perl.pkg";
 
 print OUT "#{\"perl$VERSION\"},(0x100051d8),$PATCH,$EPOC_VERSION,0\n";
 
-print OUT "\"$CROSSREPLACEPATH\\perlmain.exe\"-\"!:\\perl.exe\"\n";
+print OUT "\"$CROSSREPLACEPATH\\perlmain.exe\"-\"!:\\system\\programs\\perl.exe\"\n";
 
 find(\&filefound, cwd.'/lib');
 print OUT "@\"G:\\lib\\stdlib.sis\",(0x0100002c3)\n"
index 498036d..a2691f3 100644 (file)
@@ -58,6 +58,7 @@ Perl_epoc_init(int *argcp, char ***argvp) {
 
 }
 
+
 #ifdef __MARM__
 /* Symbian forgot to include __fixunsdfi into the MARM euser.lib */
 /* This is from libgcc2.c , gcc-2.7.2.3                          */
@@ -86,6 +87,8 @@ __fixunsdfsi (a)
   return (SItype) a;
 }
 
+#endif
+
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
@@ -143,5 +146,64 @@ do_spawn (pTHX_ SV *really,SV **mark,SV **sp)
     return rc;
 }
 
-#endif
+static
+XS(epoc_getcwd)   /* more or less stolen from win32.c */
+{
+    dXSARGS;
+    /* Make the host for current directory */
+    char *buffer; 
+    int buflen = 256;
+
+    char *ptr;
+    buffer = (char *) malloc( buflen);
+    if (buffer == NULL) {
+      XSRETURN_UNDEF;
+    }
+    while ((NULL == ( ptr = getcwd( buffer, buflen))) && (errno == ERANGE)) {
+      buflen *= 2;
+      if (NULL == realloc( buffer, buflen)) {
+        XSRETURN_UNDEF;
+      }
+      
+    }
+
+    /* 
+     * If ptr != Nullch 
+     *   then it worked, set PV valid, 
+     *   else return 'undef' 
+     */
+
+    if (ptr) {
+       SV *sv = sv_newmortal();
+       char *tptr;
+
+       for (tptr = ptr; *tptr != '\0'; tptr++) {
+         if (*tptr == '\\') {
+           *tptr = '/';
+         }
+       }
+       sv_setpv(sv, ptr);
+       free( buffer);
+
+       EXTEND(SP,1);
+       SvPOK_on(sv);
+       ST(0) = sv;
+       XSRETURN(1);
+    }
+    free( buffer);
+    XSRETURN_UNDEF;
+}
+  
+
+void
+Perl_init_os_extras(void)
+{ 
+  dTHXo;
+  char *file = __FILE__;
+  newXS("EPOC::getcwd", epoc_getcwd, file);
+}
+
+void
+Perl_my_setenv(pTHX_ char *nam,char *val) {
+  setenv( nam, val, 1);
+}
index b11da40..c1c6bcf 100644 (file)
@@ -8,8 +8,6 @@
 
 #include <string.h>
 
-char *environ = 0;
-
 int getgid() {return 0;}
 int getegid() {return 0;}
 int geteuid() {return 0;}
@@ -31,7 +29,7 @@ signal() { }
 int execv() { return -1;}
 int execvp() { return -1;}
 
-void Perl_do_exec() {} 
+void Perl_do_exec() {}
 
 /*------------------------------------------------------------------*/
 /* Two dummy functions implement getproto*                          */
index 75a64fc..551d1f5 100644 (file)
 double epoc_atof( const char *ptr);
 #define atof(a) epoc_atof(a)
 
+#define init_os_extras Perl_init_os_extras
 
+#define NO_ENVIRON_ARRAY
index 9da8a35..ab3bd65 100644 (file)
@@ -15,11 +15,11 @@ system("arm-pe-dlltool --as=arm-pe-as --output-exp $basname.exp " .
        "--base-file $basname.bas $epoc/lib/eexe.o @objs " .
        "$epoc/lib/ecrt0.o $epoc/lib/estlib.lib  $epoc/lib/euser.lib");
 
-system("arm-pe-ld -s -e _E32Startup -o $basname.exe $basname.exp " .
+system("arm-pe-ld -s -e _E32Startup $basname.exp " .
        "-o $baspe.exe $epoc/lib/eexe.o @objs " .
        "$epoc/lib/ecrt0.o $epoc/lib/estlib.lib $epoc/lib/euser.lib");
 
-system( "wine \"$epoc/bin/petran.exe $baspe.exe $basname.exe " .
+system( "wine $epoc/bin/petran.exe \"$baspe.exe $basname.exe " .
         "-nocall -heap 0x00000400 0x00400000 -stack 0x0000c000 " .
-        "-uid1 0x1000007a -uid2 0x100051d8 -uid3 0x00000000 \" ");
+        "-uid1 0x1000007a -uid2 0x100051d8 -uid3 0x00000000\" ");
 
index ef59c4a..bea023a 100644 (file)
@@ -850,7 +850,7 @@ sub compile {
                $compress_nullops = 1;
                $omit_seq = 1;
            }
-       } elsif ($opt eq "P") {
+       } elsif ($opt eq "u") {
            $arg ||= shift @options;
            push @packages, $arg;
        } else {
@@ -975,7 +975,7 @@ Prints each CV taken from the final symbol tree walk.
 Output (bytecode) assembler source rather than piping it
 through the assembler and outputting bytecode.
 
-=item B<-Ppackage>
+=item B<-upackage>
   
 Stores package in the output.
   
@@ -983,16 +983,16 @@ Stores package in the output.
 
 =head1 EXAMPLES
 
-    perl -MO=Bytecode,-O6,-ofoo.plc,-Pmain foo.pl
+    perl -MO=Bytecode,-O6,-ofoo.plc,-umain foo.pl
 
-    perl -MO=Bytecode,-S,-Pmain foo.pl > foo.S
+    perl -MO=Bytecode,-S,-umain foo.pl > foo.S
     assemble foo.S > foo.plc
 
 Note that C<assemble> lives in the C<B> subdirectory of your perl
 library directory. The utility called perlcc may also be used to 
 help make use of this compiler.
 
-    perl -MO=Bytecode,-PFoo,-oFoo.pmc Foo.pm
+    perl -MO=Bytecode,-uFoo,-oFoo.pmc Foo.pm
 
 =head1 BUGS
 
index ae7a973..3e212e2 100644 (file)
@@ -244,7 +244,7 @@ sub B::SPECIAL::debug {
 sub compile {
     my $order = shift;
     B::clearsym();
-    if ($order eq "exec") {
+    if ($order && $order eq "exec") {
         return sub { walkoptree_exec(main_start, "debug") }
     } else {
         return sub { walkoptree(main_root, "debug") }
index d093fbb..5c5c5eb 100644 (file)
@@ -2548,7 +2548,7 @@ sub tr_decode_byte {
        }
        @from = @newfrom;
     }
-    unless ($flags & OPpTRANS_DELETE) {
+    unless ($flags & OPpTRANS_DELETE || !@to) {
        pop @to while $#to and $to[$#to] == $to[$#to -1];
     }
     my($from, $to);
index 83dc5a5..c6acd28 100644 (file)
@@ -217,7 +217,11 @@ typedef IV IV64;
  *     -- BKS, June 2000
 */
 
-#define HEADER_FAIL(f, arg1, arg2)     \
+#define HEADER_FAIL(f) \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f)
+#define HEADER_FAIL1(f, arg1)  \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1)
+#define HEADER_FAIL2(f, arg1, arg2)    \
        Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1, arg2)
 
 #define BYTECODE_HEADER_CHECK                                  \
@@ -227,27 +231,27 @@ typedef IV IV64;
                                                                \
            BGET_U32(sz); /* Magic: 'PLBC' */                   \
            if (sz != 0x43424c50) {                             \
-               HEADER_FAIL("bad magic (want 0x43424c50, got %#x)", sz, 0);             \
+               HEADER_FAIL1("bad magic (want 0x43424c50, got %#x)", (int)sz);          \
            }                                                   \
            BGET_strconst(str); /* archname */                  \
            if (strNE(str, ARCHNAME)) {                         \
-               HEADER_FAIL("wrong architecture (want %s, you have %s)",str,ARCHNAME);  \
+               HEADER_FAIL2("wrong architecture (want %s, you have %s)",str,ARCHNAME); \
            }                                                   \
            BGET_strconst(str); /* ByteLoader version */        \
            if (strNE(str, VERSION)) {                          \
-               HEADER_FAIL("mismatched ByteLoader versions (want %s, you have %s)",    \
+               HEADER_FAIL2("mismatched ByteLoader versions (want %s, you have %s)",   \
                        str, VERSION);                          \
            }                                                   \
            BGET_U32(sz); /* ivsize */                          \
            if (sz != IVSIZE) {                                 \
-               HEADER_FAIL("different IVSIZE", 0, 0);          \
+               HEADER_FAIL("different IVSIZE");                \
            }                                                   \
            BGET_U32(sz); /* ptrsize */                         \
            if (sz != PTRSIZE) {                                \
-               HEADER_FAIL("different PTRSIZE", 0, 0);         \
+               HEADER_FAIL("different PTRSIZE");               \
            }                                                   \
            BGET_strconst(str); /* byteorder */                 \
            if (strNE(str, STRINGIFY(BYTEORDER))) {             \
-               HEADER_FAIL("different byteorder", 0, 0);       \
+               HEADER_FAIL("different byteorder");     \
            }                                                   \
        } STMT_END
index 9837e9c..dea57b1 100644 (file)
@@ -173,7 +173,7 @@ void
 DumpProg()
 PPCODE:
 {
-    warn("dumpindent is %d", PL_dumpindent);
+    warn("dumpindent is %d", (int)PL_dumpindent);
     if (PL_main_root)
        op_dump(PL_main_root);
 }
index 8e4936d..350b0d5 100644 (file)
@@ -198,7 +198,7 @@ int
 dl_unload_file(libref)
     void *     libref
   CODE:
-    DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_unload_file(%lx):\n", libref));
+    DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_unload_file(%lx):\n", PTR2ul(libref)));
     RETVAL = (dlclose(libref) == 0 ? 1 : 0);
     if (!RETVAL)
         SaveError(aTHX_ "%s", dlerror()) ;
index 9d84206..b6cb410 100644 (file)
@@ -71,7 +71,7 @@ corresponding built-in functions:
     $io->printf ( FMT, [ARGS] )
     $io->stat
     $io->sysread ( BUF, LEN, [OFFSET] )
-    $io->syswrite ( BUF, LEN, [OFFSET] )
+    $io->syswrite ( BUF, [LEN, [OFFSET]] )
     $io->truncate ( LEN )
 
 See L<perlvar> for complete descriptions of each of the following
@@ -425,8 +425,11 @@ sub write {
 
 sub syswrite {
     @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])';
-    $_[2] = length($_[1]) unless defined $_[2];
-    syswrite($_[0], $_[1], $_[2], $_[3] || 0);
+    if (defined($_[2])) {
+       syswrite($_[0], $_[1], $_[2], $_[3] || 0);
+    } else {
+       syswrite($_[0], $_[1]);
+    }
 }
 
 sub stat {
index d083f48..2a11752 100644 (file)
@@ -37,7 +37,7 @@ sub configure {
        $sock->bind($addr) or
            return undef;
     }
-    if(exists $arg->{Listen}) {
+    if(exists $arg->{Listen} && $type != SOCK_DGRAM) {
        $sock->listen($arg->{Listen} || 5) or
            return undef;
     }
index 047a710..e581f36 100644 (file)
@@ -465,6 +465,7 @@ Perl_utf8_hop
 Perl_utf8_to_bytes
 Perl_bytes_to_utf8
 Perl_utf8_to_uv
+Perl_utf8_to_uv_chk
 Perl_uv_to_utf8
 Perl_warn
 Perl_vwarn
diff --git a/handy.h b/handy.h
index d82b1c6..f0e39af 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -48,10 +48,10 @@ Null SV pointer.
    just figure out all the headers such a test needs.
    Andy Dougherty      August 1996
 */
-/* bool is built-in for g++-2.6.3 and later, which might be used 
+/* bool is built-in for g++-2.6.3 and later, which might be used
    for extensions.  <_G_config.h> defines _G_HAVE_BOOL, but we can't
    be sure _G_config.h will be included before this file.  _G_config.h
-   also defines _G_HAVE_BOOL for both gcc and g++, but only g++ 
+   also defines _G_HAVE_BOOL for both gcc and g++, but only g++
    actually has bool.  Hence, _G_HAVE_BOOL is pretty useless for us.
    g++ can be identified by __GNUG__.
    Andy Dougherty      February 2000
@@ -101,8 +101,8 @@ Null SV pointer.
    Similarly, there is no guarantee that I16 and U16 have exactly 16
    bits.
 
-   For dealing with issues that may arise from various 32/64-bit 
-   systems, we will ask Configure to check out 
+   For dealing with issues that may arise from various 32/64-bit
+   systems, we will ask Configure to check out
 
        SHORTSIZE == sizeof(short)
        INTSIZE == sizeof(int)
@@ -448,21 +448,21 @@ Converts the specified character to lowercase.
 #define isPSXSPC_utf8(c)       (isSPACE_utf8(c) ||(c) == '\f')
 #define isBLANK_utf8(c)                isBLANK(c) /* could be wrong */
 
-#define isALNUM_LC_utf8(p)     isALNUM_LC_uni(utf8_to_uv(p, 0))
-#define isIDFIRST_LC_utf8(p)   isIDFIRST_LC_uni(utf8_to_uv(p, 0))
-#define isALPHA_LC_utf8(p)     isALPHA_LC_uni(utf8_to_uv(p, 0))
-#define isSPACE_LC_utf8(p)     isSPACE_LC_uni(utf8_to_uv(p, 0))
-#define isDIGIT_LC_utf8(p)     isDIGIT_LC_uni(utf8_to_uv(p, 0))
-#define isUPPER_LC_utf8(p)     isUPPER_LC_uni(utf8_to_uv(p, 0))
-#define isLOWER_LC_utf8(p)     isLOWER_LC_uni(utf8_to_uv(p, 0))
-#define isALNUMC_LC_utf8(p)    isALNUMC_LC_uni(utf8_to_uv(p, 0))
-#define isCNTRL_LC_utf8(p)     isCNTRL_LC_uni(utf8_to_uv(p, 0))
-#define isGRAPH_LC_utf8(p)     isGRAPH_LC_uni(utf8_to_uv(p, 0))
-#define isPRINT_LC_utf8(p)     isPRINT_LC_uni(utf8_to_uv(p, 0))
-#define isPUNCT_LC_utf8(p)     isPUNCT_LC_uni(utf8_to_uv(p, 0))
-#define toUPPER_LC_utf8(p)     toUPPER_LC_uni(utf8_to_uv(p, 0))
-#define toTITLE_LC_utf8(p)     toTITLE_LC_uni(utf8_to_uv(p, 0))
-#define toLOWER_LC_utf8(p)     toLOWER_LC_uni(utf8_to_uv(p, 0))
+#define isALNUM_LC_utf8(p)     isALNUM_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isIDFIRST_LC_utf8(p)   isIDFIRST_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isALPHA_LC_utf8(p)     isALPHA_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isSPACE_LC_utf8(p)     isSPACE_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isDIGIT_LC_utf8(p)     isDIGIT_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isUPPER_LC_utf8(p)     isUPPER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isLOWER_LC_utf8(p)     isLOWER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isALNUMC_LC_utf8(p)    isALNUMC_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isCNTRL_LC_utf8(p)     isCNTRL_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isGRAPH_LC_utf8(p)     isGRAPH_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isPRINT_LC_utf8(p)     isPRINT_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isPUNCT_LC_utf8(p)     isPUNCT_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define toUPPER_LC_utf8(p)     toUPPER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define toTITLE_LC_utf8(p)     toTITLE_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define toLOWER_LC_utf8(p)     toLOWER_LC_uni(utf8_to_uv_chk(p, 0, 0))
 
 #define isPSXSPC_LC_utf8(c)    (isSPACE_LC_utf8(c) ||(c) == '\f')
 #define isBLANK_LC_utf8(c)     isBLANK(c) /* could be wrong */
@@ -484,7 +484,7 @@ typedef U16 line_t;
 #endif
 
 
-/* 
+/*
    XXX LEAKTEST doesn't really work in perl5.  There are direct calls to
    safemalloc() in the source, so LEAKTEST won't pick them up.
    (The main "offenders" are extensions.)
@@ -501,7 +501,7 @@ typedef U16 line_t;
 Creates a new SV.  A non-zero C<len> parameter indicates the number of
 bytes of preallocated string space the SV should have.  An extra byte for a
 tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
-space is allocated.)  The reference count for the new SV is set to 1. 
+space is allocated.)  The reference count for the new SV is set to 1.
 C<id> is an integer id between 0 and 1299 (used to identify leaks).
 
 =for apidoc Am|void|New|int id|void* ptr|int nitems|type
index a7d8bf2..5b79709 100644 (file)
@@ -37,7 +37,15 @@ OpenBSD.alpha|OpenBSD.mips|OpenBSD.powerpc|OpenBSD.vax)
        # we use -fPIC here because -fpic is *NOT* enough for some of the
        # extensions like Tk on some OpenBSD platforms (ie: sparc)
        cccdlflags="-DPIC -fPIC $cccdlflags"
-       lddlflags="-Bshareable $lddlflags"
+       case "$osvers" in
+       [01].*|2.[0-7]|2.[0-7].*)
+               lddlflags="-Bshareable $lddlflags"
+               ;;
+       *) # from 2.8 onwards
+               ld=${cc:-cc}
+               lddlflags="-shared $lddlflags"
+               ;;
+       esac
        ;;
 esac
 
index 6d33385..7a99de0 100644 (file)
@@ -249,6 +249,8 @@ nm_opt='-p'
 
 ####### We define these functions ourselves
 
+d_strtoll='define'
+d_strtoull='define'
 d_getprior='define'
 d_setprior='define'
 
index c65af5a..99d376f 100755 (executable)
@@ -60,6 +60,8 @@ while (@ARGV) {
     shift;
 }
 
+$versiononly = 1 if $Config{versiononly};
+
 my @scripts = qw(utils/c2ph utils/h2ph utils/h2xs utils/perlbug utils/perldoc
                utils/pl2pm utils/splain utils/perlcc utils/dprofpp
                x2p/s2p x2p/find2perl 
@@ -364,26 +366,25 @@ if (! $versiononly && (-f 'cppstdin') && (! samepath($installbin, '.'))) {
     chmod(0755, "$installbin/cppstdin");
 }
 
-# Install scripts.
+if (! $versiononly) {
+    # Install scripts.
 
-mkpath($installscript, $verbose, 0777);
+    mkpath($installscript, $verbose, 0777);
 
-if (! $versiononly) {
     for (@scripts) {
        (my $base = $_) =~ s#.*/##;
        copy($_, "$installscript/$base");
        chmod(0755, "$installscript/$base");
     }
-}
-
-# pstruct should be a link to c2ph
 
-if (! $versiononly) {
+    # pstruct should be a link to c2ph
     safe_unlink("$installscript/pstruct$scr_ext");
     if ($^O eq 'dos' or $Is_VMS or $^O eq 'transit') {
-        copy("$installscript/c2ph$scr_ext", "$installscript/pstruct$scr_ext"); 
+       copy("$installscript/c2ph$scr_ext",
+            "$installscript/pstruct$scr_ext"); 
     } else {
-        link("$installscript/c2ph$scr_ext", "$installscript/pstruct$scr_ext");
+       link("$installscript/c2ph$scr_ext",
+            "$installscript/pstruct$scr_ext");
     }
 }
 
@@ -391,7 +392,7 @@ if (! $versiononly) {
 # ($installprivlib/pods for cygwin).
 
 my $pod = $Is_Cygwin ? 'pods' : 'pod';
-unless ( $versiononly && !($installprivlib =~ m/\Q$ver/)) {
+if ( !$versiononly || ($installprivlib =~ m/\Q$ver/)) {
     mkpath("${installprivlib}/$pod", $verbose, 0777);
 
     # If Perl 5.003's perldiag.pod is there, rename it.
index c26db72..af33ee8 100644 (file)
@@ -4,6 +4,7 @@ use 5.005_64;
 our(@EXPORT, @EXPORT_OK, $VERSION);
 
 my $is_dosish;
+my $is_epoc;
 my $is_vms;
 
 BEGIN {
@@ -11,6 +12,7 @@ BEGIN {
     @EXPORT = @EXPORT = ();
     @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD);
     $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32';
+    $is_epoc = $^O eq 'epoc';
     $is_vms = $^O eq 'VMS';
     $VERSION = '5.57';
 }
@@ -51,7 +53,11 @@ AUTOLOAD {
                             $filename = "./$filename";
                        }
                    }
-                   elsif ($is_vms) {
+                   elsif ($is_epoc) {
+                       unless ($filename =~ m{^([a-z?]:)?[\\/]}is) {
+                            $filename = "./$filename";
+                       }
+                   }elsif ($is_vms) {
                        # XXX todo by VMSmiths
                        $filename = "./$filename";
                    }
index a847c9d..fd06f64 100644 (file)
@@ -17,8 +17,8 @@ require 5.004;
 # The most recent version and complete docs are available at:
 #   http://stein.cshl.org/WWW/software/CGI/
 
-$CGI::revision = '$Id: CGI.pm,v 1.42 2000/08/13 16:04:43 lstein Exp $';
-$CGI::VERSION='2.72';
+$CGI::revision = '$Id: CGI.pm,v 1.45 2000/09/13 02:55:41 lstein Exp $';
+$CGI::VERSION='2.74';
 
 # HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
 # UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
@@ -1294,15 +1294,15 @@ sub start_html {
         $dtd = $XHTML ? XHTML_DTD : $DEFAULT_DTD;
     }
     if (ref($dtd) && ref($dtd) eq 'ARRAY') {
-        push(@result,qq(<!DOCTYPE HTML\n\tPUBLIC "$dtd->[0]"\n\t"$dtd->[1]">));
+        push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd->[0]"\n\t"$dtd->[1]">));
     } else {
-        push(@result,qq(<!DOCTYPE HTML\n\tPUBLIC "$dtd">));
+        push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd">));
     }
     push(@result,$XHTML ? qq(<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang"><head><title>$title</title>)
                         : qq(<html lang="$lang"><head><title>$title</title>));
        if (defined $author) {
     push(@result,$XHTML ? "<link rev=\"made\" href=\"mailto:$author\" />"
-                                                               : "<link rev=made href=\"mailto:$author\">");
+                                                               : "<link rev=\"made\" href=\"mailto:$author\">");
        }
 
     if ($base || $xbase || $target) {
@@ -1461,10 +1461,13 @@ sub startform {
     my($method,$action,$enctype,@other) = 
        rearrange([METHOD,ACTION,ENCTYPE],@p);
 
-    $method = uc($method) || 'POST';
+    $method = lc($method) || 'post';
     $enctype = $enctype || &URL_ENCODED;
-    $action = $action ? qq(action="$action") : qq 'action="' . 
-              $self->url(-absolute=>1,-path=>1,-query=>1) . '"';
+    unless (defined $action) {
+       $action = $self->url(-absolute=>1,-path=>1);
+       $action .= "?$ENV{QUERY_STRING}" if $ENV{QUERY_STRING};
+    }
+    $action = qq(action="$action");
     my($other) = @other ? " @other" : '';
     $self->{'.parametersToAdd'}={};
     return qq/<form method="$method" $action enctype="$enctype"$other>\n/;
@@ -1776,9 +1779,9 @@ sub checkbox {
 
     if (!$override && ($self->{'.fieldnames'}->{$name} || 
                       defined $self->param($name))) {
-       $checked = grep($_ eq $value,$self->param($name)) ? ' checked="yes"' : '';
+       $checked = grep($_ eq $value,$self->param($name)) ? ' checked' : '';
     } else {
-       $checked = $checked ? qq/ checked="yes"/ : '';
+       $checked = $checked ? qq/ checked/ : '';
     }
     my($the_label) = defined $label ? $label : $name;
     $name = $self->escapeHTML($name);
@@ -1843,7 +1846,7 @@ sub checkbox_group {
 
     my($other) = @other ? " @other" : '';
     foreach (@values) {
-       $checked = $checked{$_} ? qq/ checked="yes"/ : '';
+       $checked = $checked{$_} ? qq/ checked/ : '';
        $label = '';
        unless (defined($nolabels) && $nolabels) {
            $label = $_;
@@ -1988,7 +1991,7 @@ sub radio_group {
 
     my($other) = @other ? " @other" : '';
     foreach (@values) {
-       my($checkit) = $checked eq $_ ? qq/ checked="yes"/ : '';
+       my($checkit) = $checked eq $_ ? qq/ checked/ : '';
        my($break);
        if ($linebreak) {
     $break = $XHTML ? "<br />" : "<br>";
@@ -2049,7 +2052,7 @@ sub popup_menu {
 
     $result = qq/<select name="$name"$other>\n/;
     foreach (@values) {
-       my($selectit) = defined($selected) ? ($selected eq $_ ? qq/selected="yes"/ : '' ) : '';
+       my($selectit) = defined($selected) ? ($selected eq $_ ? qq/selected/ : '' ) : '';
        my($label) = $_;
        $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
        my($value) = $self->escapeHTML($_);
@@ -2096,14 +2099,14 @@ sub scrolling_list {
     $size = $size || scalar(@values);
 
     my(%selected) = $self->previous_or_default($name,$defaults,$override);
-    my($is_multiple) = $multiple ? qq/ multiple="yes"/ : '';
+    my($is_multiple) = $multiple ? qq/ multiple/ : '';
     my($has_size) = $size ? qq/ size="$size"/: '';
     my($other) = @other ? " @other" : '';
 
     $name=$self->escapeHTML($name);
     $result = qq/<select name="$name"$has_size$is_multiple$other>\n/;
     foreach (@values) {
-       my($selectit) = $selected{$_} ? qq/selected="yes"/ : '';
+       my($selectit) = $selected{$_} ? qq/selected/ : '';
        my($label) = $_;
        $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
        $label=$self->escapeHTML($label);
@@ -2153,8 +2156,8 @@ sub hidden {
     $name=$self->escapeHTML($name);
     foreach (@value) {
        $_ = defined($_) ? $self->escapeHTML($_,1) : '';
-       push(@result,$XHTMl ? qq(<input type="hidden" name="$name" value="$_" />)
-                            : qq/<input type="hidden" name="$name" value="$_">/);
+       push @result,$XHTMl ? qq(<input type="hidden" name="$name" value="$_" />)
+                            : qq(<input type="hidden" name="$name" value="$_">);
     }
     return wantarray ? @result : join('',@result);
 }
@@ -2215,10 +2218,10 @@ END_OF_FUNC
 'url' => <<'END_OF_FUNC',
 sub url {
     my($self,@p) = self_or_default(@_);
-    my ($relative,$absolute,$full,$path_info,$query) = 
-       rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING']],@p);
+    my ($relative,$absolute,$full,$path_info,$query,$base) = 
+       rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE'],@p);
     my $url;
-    $full++ if !($relative || $absolute);
+    $full++ if $base || !($relative || $absolute);
 
     my $path = $self->path_info;
     my $script_name = $self->script_name;
@@ -2251,12 +2254,14 @@ sub url {
                unless (lc($protocol) eq 'http' && $port == 80)
                    || (lc($protocol) eq 'https' && $port == 443);
        }
+        return $url if $base;
        $url .= $script_name;
     } elsif ($relative) {
        ($url) = $script_name =~ m!([^/]+)$!;
     } elsif ($absolute) {
        $url = $script_name;
     }
+
     $url .= $path if $path_info and defined $path;
     $url .= "?" . $self->query_string if $query and $self->query_string;
     $url = '' unless defined $url;
@@ -3173,8 +3178,7 @@ sub read {
     die "Malformed multipart POST\n" unless ($start >= 0) || ($self->{LENGTH} > 0);
 
     # If the boundary begins the data, then skip past it
-    # and return undef.  The +2 here is a fiendish plot to
-    # remove the CR/LF pair at the end of the boundary.
+    # and return undef.
     if ($start == 0) {
 
        # clear us out completely if we've hit the last boundary.
@@ -3185,7 +3189,8 @@ sub read {
        }
 
        # just remove the boundary.
-       substr($self->{BUFFER},0,length($self->{BOUNDARY})+2)='';
+       substr($self->{BUFFER},0,length($self->{BOUNDARY}))='';
+        $self->{BUFFER} =~ s/^\012\015?//;
        return undef;
     }
 
@@ -4519,6 +4524,7 @@ You can also retrieve the unprocessed query string with query_string():
     $absolute_url  = $query->url(-absolute=>1);
     $url_with_path = $query->url(-path_info=>1);
     $url_with_path_and_query = $query->url(-path_info=>1,-query=>1);
+    $netloc        = $query->url(-base => 1);
 
 B<url()> returns the script's URL in a variety of formats.  Called
 without any arguments, it returns the full form of the URL, including
@@ -4560,6 +4566,10 @@ Append the query string to the URL.  This can be combined with
 B<-full>, B<-absolute> or B<-relative>.  B<-query_string> is provided
 as a synonym.
 
+=item B<-base>
+
+Generate just the protocol and net location, as in http://www.foo.com:8000
+
 =back
 
 =head2 MIXING POST AND URL PARAMETERS
@@ -5807,13 +5817,17 @@ To create multiple cookies, give header() an array reference:
                                  -value=>\%answers);
        print $query->header(-cookie=>[$cookie1,$cookie2]);
 
-To retrieve a cookie, request it by name by calling cookie()
-method without the B<-value> parameter:
+To retrieve a cookie, request it by name by calling cookie() method
+without the B<-value> parameter:
 
        use CGI;
        $query = new CGI;
-       %answers = $query->cookie(-name=>'answers');
-       # $query->cookie('answers') will work too!
+       $riddle = $query->cookie('riddle_name');
+        %answers = $query->cookie('answers');
+
+Cookies created with a single scalar value, such as the "riddle_name"
+cookie, will be returned in that form.  Cookies with array and hash
+values can also be retrieved.
 
 The cookie and CGI namespaces are separate.  If you have a parameter
 named 'answers' and a cookie named 'answers', the values retrieved by
@@ -6112,6 +6126,10 @@ name.
 When using virtual hosts, returns the name of the host that
 the browser attempted to contact
 
+=item B<server_port ()>
+
+Return the port that the server is listening on.
+
 =item B<server_software ()>
 
 Returns the server software and version number.
index 2f51689..dbeae69 100644 (file)
@@ -346,6 +346,11 @@ sub _qnx_abs_path {
     return $realpath;
 }
 
+sub _epoc_cwd {
+    $ENV{'PWD'} = EPOC::getcwd();
+    return $ENV{'PWD'};
+}
+
 {
     no warnings;       # assignments trigger 'subroutine redefined' warning
 
@@ -394,6 +399,12 @@ sub _qnx_abs_path {
         *fastcwd       = \&cwd;
         *abs_path      = \&fast_abs_path;
     }
+    elsif ($^O eq 'epoc') {
+        *getcwd        = \&_epoc_cwd;
+        *fastgetcwd    = \&_epoc_cwd;
+        *fastcwd       = \&_epoc_cwd;
+        *abs_path      = \&fast_abs_path;
+    }
 }
 
 # package main; eval join('',<DATA>) || die $@;        # quick test
index 1afd210..52862c5 100644 (file)
@@ -1140,9 +1140,9 @@ in these dirs:
 @$dirs
 ";
     }
-    foreach $dir (@$dirs){
-       next unless defined $dir; # $self->{PERL_SRC} may be undefined
-       foreach $name (@$names){
+    foreach $name (@$names){
+       foreach $dir (@$dirs){
+           next unless defined $dir; # $self->{PERL_SRC} may be undefined
            my ($abs, $val);
            if ($self->file_name_is_absolute($name)) { # /foo/bar
                $abs = $name;
index 8bb3fc8..28b7053 100644 (file)
@@ -238,7 +238,7 @@ sub cp {
 
 sub ln {
     my ($srcFile, $dstFile) = @_;
-    return &cp if $Is_VMS;
+    return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95());
     link($srcFile, $dstFile);
     local($_) = $dstFile; # chmod a+r,go-w+X (except "X" only applies to u=x)
     my $mode= 0444 | (stat)[2] & 0700;
index e6cf786..8d1d783 100644 (file)
@@ -221,7 +221,7 @@ File::Copy - Copy files or filehandles
        use POSIX;
        use File::Copy cp;
 
-       $n=FileHandle->new("/dev/null","r");
+       $n = FileHandle->new("/a/file","r");
        cp($n,"x");'
 
 =head1 DESCRIPTION
index de9bb9b..6e6e462 100644 (file)
@@ -71,7 +71,7 @@ If either I<follow> or I<follow_fast> is in effect:
 
 =item *
 
-It is guarantueed that an I<lstat> has been called before the user's
+It is guaranteed that an I<lstat> has been called before the user's
 I<wanted()> function is called. This enables fast file checks involving S< _>.
 
 =item *
@@ -83,11 +83,10 @@ pathname of the file with all symbolic links resolved
 
 =item C<follow_fast>
 
-This is similar to I<follow> except that it may report some files
-more than once. It does detect cycles however.
-Since only symbolic links have to be hashed, this is
-much cheaper both in space and time.
-If processing a file more than once (by the user's I<wanted()> function)
+This is similar to I<follow> except that it may report some files more
+than once.  It does detect cycles, however.  Since only symbolic links
+have to be hashed, this is much cheaper both in space and time.  If
+processing a file more than once (by the user's I<wanted()> function)
 is worse than just taking time, the option I<follow> should be used.
 
 =item C<follow_skip>
@@ -113,14 +112,14 @@ C<$_> will be the same as C<$File::Find::name>.
 If find is used in taint-mode (-T command line switch or if EUID != UID
 or if EGID != GID) then internally directory names have to be untainted
 before they can be cd'ed to. Therefore they are checked against a regular
-expression I<untaint_pattern>. Note, that all names passed to the
+expression I<untaint_pattern>.  Note that all names passed to the
 user's I<wanted()> function are still tainted. 
 
 =item C<untaint_pattern>
 
 See above. This should be set using the C<qr> quoting operator.
 The default is set to  C<qr|^([-+@\w./]+)$|>. 
-Note that the paranthesis which are vital.
+Note that the parantheses are vital.
 
 =item C<untaint_skip>
 
@@ -132,15 +131,15 @@ are skipped. The default is to 'die' in such a case.
 The wanted() function does whatever verifications you want.
 C<$File::Find::dir> contains the current directory name, and C<$_> the
 current filename within that directory.  C<$File::Find::name> contains
-the complete pathname to the file. You are chdir()'d to C<$File::Find::dir> when
-the function is called, unless C<no_chdir> was specified.
-When <follow> or <follow_fast> are in effect there is also a
-C<$File::Find::fullname>.
-The function may set C<$File::Find::prune> to prune the tree
-unless C<bydepth> was specified.
-Unless C<follow> or C<follow_fast> is specified, for compatibility
-reasons (find.pl, find2perl) there are in addition the following globals
-available: C<$File::Find::topdir>, C<$File::Find::topdev>, C<$File::Find::topino>,
+the complete pathname to the file. You are chdir()'d to
+C<$File::Find::dir> when the function is called, unless C<no_chdir>
+was specified.  When <follow> or <follow_fast> are in effect, there is
+also a C<$File::Find::fullname>.  The function may set
+C<$File::Find::prune> to prune the tree unless C<bydepth> was
+specified.  Unless C<follow> or C<follow_fast> is specified, for
+compatibility reasons (find.pl, find2perl) there are in addition the
+following globals available: C<$File::Find::topdir>,
+C<$File::Find::topdev>, C<$File::Find::topino>,
 C<$File::Find::topmode> and C<$File::Find::topnlink>.
 
 This library is useful for the C<find2perl> tool, which when fed,
@@ -177,7 +176,7 @@ module.
 
 =head1 CAVEAT
 
-Be aware that the option to follow symblic links can be dangerous.
+Be aware that the option to follow symbolic links can be dangerous.
 Depending on the structure of the directory tree (including symbolic
 links to directories) you might traverse a given (physical) directory
 more than once (only if C<follow_fast> is in effect). 
index 8484cd5..0fdb6d0 100644 (file)
@@ -1,5 +1,5 @@
 # Pod::Man -- Convert POD data to formatted *roff input.
-# $Id: Man.pm,v 1.7 2000/09/03 09:22:57 eagle Exp $
+# $Id: Man.pm,v 1.8 2000/10/10 02:14:31 eagle Exp $
 #
 # Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
 #
@@ -38,7 +38,7 @@ use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION);
 # Perl core and too many things could munge CVS magic revision strings.
 # This number should ideally be the same as the CVS revision in podlators,
 # however.
-$VERSION = 1.07;
+$VERSION = 1.08;
 
 
 ############################################################################
@@ -185,7 +185,8 @@ $PREAMBLE = <<'----END OF PREAMBLE----';
 .\}
 .rm #[ #] #H #V #F C
 ----END OF PREAMBLE----
-                                   
+#`# for cperl-mode
+
 # This table is taken nearly verbatim from Tom Christiansen's pod2man.  It
 # assumes that the standard preamble has already been printed, since that's
 # what defines all of the accent marks.  Note that some of these are quoted
@@ -277,7 +278,7 @@ sub protect {
     s/^([.\'\\])/\\&$1/mg;
     $_;
 }
-                    
+
 # Given a command and a single argument that may or may not contain double
 # quotes, handle double-quote formatting for it.  If there are no double
 # quotes, just return the command followed by the argument in double quotes.
@@ -308,7 +309,7 @@ sub switchquotes {
 # Translate a font string into an escape.
 sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] }
 
-                    
+
 ############################################################################
 # Initialization
 ############################################################################
@@ -374,7 +375,7 @@ sub initialize {
     }
 
     # Figure out what quotes we'll be using for C<> text.
-    $$self{quotes} ||= "'";
+    $$self{quotes} ||= '"';
     if ($$self{quotes} eq 'none') {
         $$self{LQUOTE} = $$self{RQUOTE} = '';
     } elsif (length ($$self{quotes}) == 1) {
@@ -396,6 +397,7 @@ sub initialize {
     $$self{INDENT}  = 0;        # Current indentation level.
     $$self{INDENTS} = [];       # Stack of indentations.
     $$self{INDEX}   = [];       # Index keys waiting to be printed.
+    $$self{ITEMS}   = 0;        # The number of consecutive =items.
 
     $self->SUPER::initialize;
 }
@@ -490,7 +492,8 @@ sub command {
         $self->$command (@_);
      } else {
         my ($text, $line, $paragraph) = @_;
-        my ($file, $line) = $paragraph->file_line;
+        my $file;
+        ($file, $line) = $paragraph->file_line;
         $text =~ s/\n+\z//;
         $text = " $text" if ($text =~ /^\S/);
         warn qq($file:$line: Unknown command paragraph "=$command$text"\n);
@@ -512,7 +515,7 @@ sub verbatim {
     1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
     s/\\/\\e/g;
     s/^(\s*\S)/'\&' . $1/gme;
-    $self->makespace if $$self{NEEDSPACE};
+    $self->makespace;
     $self->output (".Vb $lines\n$_.Ve\n");
     $$self{NEEDSPACE} = 0;
 }
@@ -538,7 +541,7 @@ sub textblock {
           >
           (
               ,?\s+(and\s+)?    # Allow lots of them, conjuncted.
-              L<  
+              L<
                   /
                   ( [:\w]+ ( \(\) )? )
               >
@@ -564,7 +567,7 @@ sub textblock {
     # scalars as well as scalars and does the right thing with them.
     $text = $self->parse ($text, @_);
     $text =~ s/\n\s*$/\n/;
-    $self->makespace if $$self{NEEDSPACE};
+    $self->makespace;
     $self->output (protect $self->mapfonts ($text));
     $self->outindex;
     $$self{NEEDSPACE} = 1;
@@ -624,7 +627,7 @@ sub sequence {
         my $tmp = $self->buildlink ($_);
         return bless \ "$tmp", 'Pod::Man::String';
     }
-                         
+
     # Whitespace protection replaces whitespace with "\ ".
     if ($command eq 'S') {
         s/\s+/\\ /g;
@@ -654,6 +657,10 @@ sub cmd_head1 {
     local $_ = $self->parse (@_);
     s/\s+$//;
     s/\\s-?\d//g;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
     $self->output (switchquotes ('.SH', $self->mapfonts ($_)));
     $self->outindex (($_ eq 'NAME') ? () : ('Header', $_));
     $$self{NEEDSPACE} = 0;
@@ -664,6 +671,10 @@ sub cmd_head2 {
     my $self = shift;
     local $_ = $self->parse (@_);
     s/\s+$//;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
     $self->output (switchquotes ('.Sh', $self->mapfonts ($_)));
     $self->outindex ('Subsection', $_);
     $$self{NEEDSPACE} = 0;
@@ -726,9 +737,11 @@ sub cmd_item {
         $$self{WEIRDINDENT} = 0;
     }
     $_ = $self->mapfonts ($_);
+    $self->output (".PD 0\n") if ($$self{ITEMS} == 1);
     $self->output (switchquotes ('.Ip', $_, $$self{INDENT}));
     $self->outindex ($index ? ('Item', $index) : ());
     $$self{NEEDSPACE} = 0;
+    $$self{ITEMS}++;
 }
 
 # Begin a block for a particular translator.  Setting VERBATIM triggers
@@ -861,7 +874,7 @@ sub parse {
     $self->parse_text ({ -expand_seq   => 'sequence',
                          -expand_ptree => 'collapse' }, @_);
 }
-    
+
 # Takes a parse tree and a flag saying whether or not to treat it as literal
 # text (not call guesswork on it), and returns the concatenation of all of
 # the text strings in that parse tree.  If the literal flag isn't true,
@@ -975,7 +988,10 @@ sub guesswork {
 # Make vertical whitespace.
 sub makespace {
     my $self = shift;
-    $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n");
+    $self->output (".PD\n") if ($$self{ITEMS} > 1);
+    $$self{ITEMS} = 0;
+    $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n")
+        if $$self{NEEDSPACE};
 }
 
 # Output any pending index entries, and optionally an index entry given as
index 29d0dba..5a7bab8 100644 (file)
@@ -1,5 +1,5 @@
 # Pod::Text -- Convert POD data to formatted ASCII text.
-# $Id: Text.pm,v 2.5 2000/09/03 09:23:29 eagle Exp $
+# $Id: Text.pm,v 2.6 2000/10/10 02:13:17 eagle Exp $
 #
 # Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
 #
@@ -37,7 +37,7 @@ use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
 # Perl core and too many things could munge CVS magic revision strings.
 # This number should ideally be the same as the CVS revision in podlators,
 # however.
-$VERSION = 2.05;
+$VERSION = 2.06;
 
 
 ############################################################################
@@ -55,7 +55,7 @@ $VERSION = 2.05;
     'quot'      =>    '"',      # double quote
     'sol'       =>    '/',      # solidus (forward slash)
     'verbar'    =>    '|',      # vertical bar
-                                 
+
     "Aacute"    =>    "\xC1",   # capital A, acute accent
     "aacute"    =>    "\xE1",   # small a, acute accent
     "Acirc"     =>    "\xC2",   # capital A, circumflex accent
@@ -82,8 +82,8 @@ $VERSION = 2.05;
     "eth"       =>    "\xF0",   # small eth, Icelandic
     "Euml"      =>    "\xCB",   # capital E, dieresis or umlaut mark
     "euml"      =>    "\xEB",   # small e, dieresis or umlaut mark
-    "Iacute"    =>    "\xCD",   # capital I, acute accent
-    "iacute"    =>    "\xED",   # small i, acute accent
+    "Iacute"    =>    "\xCC",   # capital I, acute accent
+    "iacute"    =>    "\xEC",   # small i, acute accent
     "Icirc"     =>    "\xCE",   # capital I, circumflex accent
     "icirc"     =>    "\xEE",   # small i, circumflex accent
     "Igrave"    =>    "\xCD",   # capital I, grave accent
@@ -118,7 +118,7 @@ $VERSION = 2.05;
     "Yacute"    =>    "\xDD",   # capital Y, acute accent
     "yacute"    =>    "\xFD",   # small y, acute accent
     "yuml"      =>    "\xFF",   # small y, dieresis or umlaut mark
-                                  
+
     "laquo"     =>    "\xAB",   # left pointing double angle quotation mark
     "lchevron"  =>    "\xAB",   #  synonym (backwards compatibility)
     "raquo"     =>    "\xBB",   # right pointing double angle quotation mark
@@ -212,7 +212,8 @@ sub command {
         $self->$command (@_);
     } else {
         my ($text, $line, $paragraph) = @_;
-        my ($file, $line) = $paragraph->file_line;
+        my $file;
+        ($file, $line) = $paragraph->file_line;
         $text =~ s/\n+\z//;
         $text = " $text" if ($text =~ /^\S/);
         warn qq($file:$line: Unknown command paragraph "=$command$text"\n);
@@ -257,7 +258,7 @@ sub textblock {
           >
           (
               ,?\s+(and\s+)?    # Allow lots of them, conjuncted.
-              L<  
+              L<
                   /
                   (
                       [:\w]+
@@ -422,7 +423,7 @@ sub cmd_end {
     my $self = shift;
     $$self{EXCLUDE} = 0;
     $$self{VERBATIM} = 0;
-}    
+}
 
 # One paragraph for a particular translator.  Ignore it unless it's intended
 # for text, in which case we treat it as a verbatim text block.
index eb83aae..e3b85d4 100644 (file)
@@ -8,30 +8,31 @@ our $VERSION = '1.01';
 # Pod documentation after __END__ below.
 
 sub DESTROY { }
-sub EXTEND  { }          
-sub UNSHIFT { shift->SPLICE(0,0,@_) }                 
-sub SHIFT   { shift->SPLICE(0,1) }                 
+sub EXTEND  { }
+sub UNSHIFT { scalar shift->SPLICE(0,0,@_) }
+sub SHIFT { shift->SPLICE(0,1) }
+#sub SHIFT   { (shift->SPLICE(0,1))[0] }
 sub CLEAR   { shift->STORESIZE(0) }
 
-sub PUSH 
-{  
+sub PUSH
+{
  my $obj = shift;
  my $i   = $obj->FETCHSIZE;
  $obj->STORE($i++, shift) while (@_);
 }
 
-sub POP 
+sub POP
 {
  my $obj = shift;
  my $newsize = $obj->FETCHSIZE - 1;
  my $val;
- if ($newsize >= 0) 
+ if ($newsize >= 0)
   {
    $val = $obj->FETCH($newsize);
    $obj->STORESIZE($newsize);
   }
  $val;
-}          
+}
 
 sub SPLICE
 {
@@ -46,7 +47,7 @@ sub SPLICE
    push(@result,$obj->FETCH($off+$i));
   }
  if (@_ > $len)
-  {                          
+  {
    # Move items up to make room
    my $d = @_ - $len;
    my $e = $off+$len;
@@ -59,7 +60,7 @@ sub SPLICE
   }
  elsif (@_ < $len)
   {
-   # Move items down to close the gap 
+   # Move items down to close the gap
    my $d = $len - @_;
    my $e = $off+$len;
    for (my $i=$off+$len; $i < $sz; $i++)
@@ -74,7 +75,7 @@ sub SPLICE
    $obj->STORE($off+$i,$_[$i]);
   }
  return @result;
-} 
+}
 
 sub EXISTS {
     my $pkg = ref $_[0];
@@ -91,21 +92,21 @@ use vars qw(@ISA);
 @ISA = 'Tie::Array';
 
 sub TIEARRAY  { bless [], $_[0] }
-sub FETCHSIZE { scalar @{$_[0]} }             
-sub STORESIZE { $#{$_[0]} = $_[1]-1 }  
+sub FETCHSIZE { scalar @{$_[0]} }
+sub STORESIZE { $#{$_[0]} = $_[1]-1 }
 sub STORE     { $_[0]->[$_[1]] = $_[2] }
 sub FETCH     { $_[0]->[$_[1]] }
 sub CLEAR     { @{$_[0]} = () }
-sub POP       { pop(@{$_[0]}) } 
+sub POP       { pop(@{$_[0]}) }
 sub PUSH      { my $o = shift; push(@$o,@_) }
-sub SHIFT     { shift(@{$_[0]}) } 
-sub UNSHIFT   { my $o = shift; unshift(@$o,@_) } 
+sub SHIFT     { shift(@{$_[0]}) }
+sub UNSHIFT   { my $o = shift; unshift(@$o,@_) }
 sub EXISTS    { exists $_[0]->[$_[1]] }
 sub DELETE    { delete $_[0]->[$_[1]] }
 
 sub SPLICE
 {
- my $ob  = shift;                    
+ my $ob  = shift;
  my $sz  = $ob->FETCHSIZE;
  my $off = @_ ? shift : 0;
  $off   += $sz if $off < 0;
@@ -121,16 +122,16 @@ __END__
 
 Tie::Array - base class for tied arrays
 
-=head1 SYNOPSIS  
+=head1 SYNOPSIS
 
     package NewArray;
     use Tie::Array;
     @ISA = ('Tie::Array');
 
     # mandatory methods
-    sub TIEARRAY { ... }  
-    sub FETCH { ... }     
-    sub FETCHSIZE { ... } 
+    sub TIEARRAY { ... }
+    sub FETCH { ... }
+    sub FETCHSIZE { ... }
 
     sub STORE { ... }        # mandatory if elements writeable
     sub STORESIZE { ... }    # mandatory if elements can be added/deleted
@@ -138,13 +139,13 @@ Tie::Array - base class for tied arrays
     sub DELETE { ... }       # mandatory if delete() expected to work
 
     # optional methods - for efficiency
-    sub CLEAR { ... }  
-    sub PUSH { ... } 
-    sub POP { ... } 
-    sub SHIFT { ... } 
-    sub UNSHIFT { ... } 
-    sub SPLICE { ... } 
-    sub EXTEND { ... } 
+    sub CLEAR { ... }
+    sub PUSH { ... }
+    sub POP { ... }
+    sub SHIFT { ... }
+    sub UNSHIFT { ... }
+    sub SPLICE { ... }
+    sub EXTEND { ... }
     sub DESTROY { ... }
 
     package NewStdArray;
@@ -162,7 +163,7 @@ Tie::Array - base class for tied arrays
 
 
 
-=head1 DESCRIPTION       
+=head1 DESCRIPTION
 
 This module provides methods for array-tying classes. See
 L<perltie> for a list of the functions required in order to tie an array
@@ -173,16 +174,16 @@ on the tied array, and implementations of C<PUSH>, C<POP>, C<SHIFT>,
 C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>,
 C<FETCHSIZE>, C<STORESIZE>.
 
-The B<Tie::StdArray> package provides efficient methods required for tied arrays 
+The B<Tie::StdArray> package provides efficient methods required for tied arrays
 which are implemented as blessed references to an "inner" perl array.
-It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly 
-like standard arrays, allowing for selective overloading of methods. 
+It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly
+like standard arrays, allowing for selective overloading of methods.
 
 For developers wishing to write their own tied arrays, the required methods
 are briefly defined below. See the L<perltie> section for more detailed
 descriptive, as well as example code:
 
-=over 
+=over
 
 =item TIEARRAY classname, LIST
 
@@ -190,7 +191,7 @@ The class method is invoked by the command C<tie @array, classname>. Associates
 an array instance with the specified class. C<LIST> would represent
 additional arguments (along the lines of L<AnyDBM_File> and compatriots) needed
 to complete the association. The method should return an object of a class which
-provides the methods below. 
+provides the methods below.
 
 =item STORE this, index, value
 
@@ -214,7 +215,7 @@ Sets the total number of items in the tied array associated with
 object I<this> to be I<count>. If this makes the array larger then
 class's mapping of C<undef> should be returned for new positions.
 If the array becomes smaller then entries beyond count should be
-deleted. 
+deleted.
 
 =item EXTEND this, count
 
@@ -242,7 +243,7 @@ object I<this>.
 
 Normal object destructor method.
 
-=item PUSH this, LIST 
+=item PUSH this, LIST
 
 Append elements of LIST to the array.
 
@@ -255,17 +256,17 @@ Remove last element of the array and return it.
 Remove the first element of the array (shifting other elements down)
 and return it.
 
-=item UNSHIFT this, LIST 
+=item UNSHIFT this, LIST
 
 Insert LIST elements at the beginning of the array, moving existing elements
 up to make room.
 
 =item SPLICE this, offset, length, LIST
 
-Perform the equivalent of C<splice> on the array. 
+Perform the equivalent of C<splice> on the array.
 
-I<offset> is optional and defaults to zero, negative values count back 
-from the end of the array. 
+I<offset> is optional and defaults to zero, negative values count back
+from the end of the array.
 
 I<length> is optional and defaults to rest of the array.
 
@@ -277,16 +278,15 @@ Returns a list of the original I<length> elements at I<offset>.
 
 =head1 CAVEATS
 
-There is no support at present for tied @ISA. There is a potential conflict 
+There is no support at present for tied @ISA. There is a potential conflict
 between magic entries needed to notice setting of @ISA, and those needed to
-implement 'tie'.   
+implement 'tie'.
 
 Very little consideration has been given to the behaviour of tied arrays
 when C<$[> is not default value of zero.
 
-=head1 AUTHOR 
+=head1 AUTHOR
 
 Nick Ing-Simmons E<lt>nik@tiuk.ti.comE<gt>
 
-=cut 
-
+=cut
index 86adad2..81b0792 100644 (file)
@@ -1,7 +1,7 @@
 package Tie::Handle;
 
 use 5.005_64;
-our $VERSION = '1.0';
+our $VERSION = '4.0';
 
 =head1 NAME
 
@@ -105,6 +105,15 @@ destruction of an instance.
 
 The L<perltie> section contains an example of tying handles.
 
+=head1 COMPATIBILITY
+
+This version of Tie::Handle is neither related to nor compatible with
+the Tie::Handle (3.0) module available on CPAN. It was due to an
+accident that two modules with the same name appeared. The namespace
+clash has been cleared in favor of this module that comes with the
+perl core in September 2000 and accordingly the version number has
+been bumped up to 4.0.
+
 =cut
 
 use Carp;
index 7c2209b..0ec7ec2 100644 (file)
@@ -1,5 +1,6 @@
 package charnames;
 use bytes ();          # for $bytes::hint_bits
+use warnings();
 $charnames::hint_bits = 0x20000;
 
 my $txt;
@@ -51,6 +52,13 @@ sub import {
   $^H{charnames_full} = delete $h{':full'};
   $^H{charnames_short} = delete $h{':short'};
   $^H{charnames_scripts} = [map uc, keys %h];
+  if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
+       $txt = do "unicode/Name.pl" unless $txt;
+    for (@{$^H{charnames_scripts}}) {
+        warnings::warn('utf8',  "No such script: '$_'") unless
+           $txt =~ m/\t\t$_ (?:CAPITAL |SMALL )?LETTER /;
+       }
+  }
 }
 
 
index bead929..2b0b99d 100644 (file)
@@ -383,6 +383,11 @@ be used instead.  C<bool> is used in the flow control operators
 return any arbitrary Perl value.  If the corresponding operation for this value
 is overloaded too, that operation will be called again with this value.
 
+As a special case if the overload returns the object itself then it will
+be used directly. An overloaded conversion returning the object is
+probably a bug, because you're likely to get something that looks like
+C<YourPackage=HASH(0x8172b34)>.
+
 =item * I<Iteration>
 
     "<>"
index 57ca5a1..2db2a6a 100644 (file)
--- a/malloc.c
+++ b/malloc.c
@@ -1060,7 +1060,7 @@ Perl_malloc(register size_t nbytes)
            dTHX;
            PerlIO_printf(PerlIO_stderr(),
                          "Unaligned `next' pointer in the free "
-                         "chain 0x"UVxf" at 0x%"UVxf"\n",
+                         "chain 0x%"UVxf" at 0x%"UVxf"\n",
                          PTR2UV(p->ov_next), PTR2UV(p));
        }
 #endif
diff --git a/mg.c b/mg.c
index e9832da..7e0b3ca 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -575,9 +575,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
            if (PL_lex_state != LEX_NOTPARSING)
                (void)SvOK_off(sv);
            else if (PL_in_eval)
-               sv_setiv(sv, 1);
-           else
-               sv_setiv(sv, 0);
+               sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
        }
        break;
     case '\024':               /* ^T */
@@ -916,7 +914,7 @@ Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
 int
 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
 {
-#if defined(VMS)
+#if defined(VMS) || defined(EPOC)
     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
 #else
 #   ifdef PERL_IMPLICIT_SYS
@@ -1425,6 +1423,8 @@ Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
     if (rem + offs > len)
        rem = len - offs;
     sv_setpvn(sv, tmps + offs, (STRLEN)rem);
+    if (DO_UTF8(lsv))
+        SvUTF8_on(sv);
     return 0;
 }
 
index 3e0ccce..49c93b8 100644 (file)
--- a/objXSUB.h
+++ b/objXSUB.h
 #define Perl_utf8_to_uv                pPerl->Perl_utf8_to_uv
 #undef  utf8_to_uv
 #define utf8_to_uv             Perl_utf8_to_uv
+#undef  Perl_utf8_to_uv_chk
+#define Perl_utf8_to_uv_chk    pPerl->Perl_utf8_to_uv_chk
+#undef  utf8_to_uv_chk
+#define utf8_to_uv_chk         Perl_utf8_to_uv_chk
 #undef  Perl_uv_to_utf8
 #define Perl_uv_to_utf8                pPerl->Perl_uv_to_utf8
 #undef  uv_to_utf8
diff --git a/op.c b/op.c
index 2d0bdca..f85ad01 100644 (file)
--- a/op.c
+++ b/op.c
@@ -2654,7 +2654,7 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            qsort(cp, i, sizeof(U8*), utf8compare);
            for (j = 0; j < i; j++) {
                U8 *s = cp[j];
-               UV val = utf8_to_uv(s, &ulen);
+               UV val = utf8_to_uv_chk(s, &ulen, 0);
                s += ulen;
                diff = val - nextmin;
                if (diff > 0) {
@@ -2667,7 +2667,7 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
                    }
                }
                if (*s == 0xff)
-                   val = utf8_to_uv(s+1, &ulen);
+                   val = utf8_to_uv_chk(s+1, &ulen, 0);
                if (val >= nextmin)
                    nextmin = val + 1;
            }
@@ -2694,10 +2694,10 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
        while (t < tend || tfirst <= tlast) {
            /* see if we need more "t" chars */
            if (tfirst > tlast) {
-               tfirst = (I32)utf8_to_uv(t, &ulen);
+               tfirst = (I32)utf8_to_uv_chk(t, &ulen, 0);
                t += ulen;
                if (t < tend && *t == 0xff) {   /* illegal utf8 val indicates range */
-                   tlast = (I32)utf8_to_uv(++t, &ulen);
+                   tlast = (I32)utf8_to_uv_chk(++t, &ulen, 0);
                    t += ulen;
                }
                else
@@ -2707,10 +2707,10 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            /* now see if we need more "r" chars */
            if (rfirst > rlast) {
                if (r < rend) {
-                   rfirst = (I32)utf8_to_uv(r, &ulen);
+                   rfirst = (I32)utf8_to_uv_chk(r, &ulen, 0);
                    r += ulen;
                    if (r < rend && *r == 0xff) {       /* illegal utf8 val indicates range */
-                       rlast = (I32)utf8_to_uv(++r, &ulen);
+                       rlast = (I32)utf8_to_uv_chk(++r, &ulen, 0);
                        r += ulen;
                    }
                    else
@@ -6453,6 +6453,22 @@ Perl_ck_trunc(pTHX_ OP *o)
     return ck_fun(o);
 }
 
+OP *
+Perl_ck_substr(pTHX_ OP *o)
+{
+    o = ck_fun(o);
+    if ((o->op_flags & OPf_KIDS) && o->op_private == 4) {
+       OP *kid = cLISTOPo->op_first;
+
+       if (kid->op_type == OP_NULL)
+           kid = kid->op_sibling;
+       if (kid)
+           kid->op_flags |= OPf_MOD;
+
+    }
+    return o;
+}
+
 /* A peephole optimizer.  We visit the ops in the order they're to execute. */
 
 void
index 513343a..8dc8b7a 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -1205,7 +1205,7 @@ EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op) = {
        MEMBER_TO_FPTR(Perl_ck_fun),    /* oct */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* abs */
        MEMBER_TO_FPTR(Perl_ck_lengthconst),    /* length */
-       MEMBER_TO_FPTR(Perl_ck_fun),    /* substr */
+       MEMBER_TO_FPTR(Perl_ck_substr), /* substr */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* vec */
        MEMBER_TO_FPTR(Perl_ck_index),  /* index */
        MEMBER_TO_FPTR(Perl_ck_index),  /* rindex */
index d138917..43d98ae 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -515,7 +515,7 @@ abs         abs                     ck_fun          fsTu%   S?
 # String stuff.
 
 length         length                  ck_lengthconst  isTu%   S?
-substr         substr                  ck_fun          st@     S S S? S?
+substr         substr                  ck_substr       st@     S S S? S?
 vec            vec                     ck_fun          ist@    S S S
 
 index          index                   ck_index        isT@    S S S?
index d6bf2df..c9719e6 100644 (file)
@@ -271,6 +271,8 @@ char *my_tmpnam (char *);
 #define isatty _isterm
 #define rand   random
 #define srand  srandom
+#define strtoll        _strtoll
+#define strtoull       _strtoull
 
 /*
  * fwrite1() should be a routine with the same calling sequence as fwrite(),
diff --git a/perl.c b/perl.c
index 42fac0e..727713a 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -377,6 +377,7 @@ perl_destruct(pTHXx)
     DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
     MUTEX_DESTROY(&PL_threads_mutex);
     COND_DESTROY(&PL_nthreads_cond);
+    PL_nthreads--;
 #endif /* !defined(FAKE_THREADS) */
 #endif /* USE_THREADS */
 
@@ -835,7 +836,7 @@ setuid perl scripts securely.\n");
 
     PL_origargv = argv;
     PL_origargc = argc;
-#ifndef VMS  /* VMS doesn't have environ array */
+#if !defined( VMS) && !defined(EPOC)  /* VMS doesn't have environ array */
     PL_origenviron = environ;
 #endif
 
@@ -1252,7 +1253,7 @@ print \"  \\@INC:\\n    @INC\\n\";");
 
     if (xsinit)
        (*xsinit)(aTHXo);       /* in case linked C routines want magical variables */
-#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__)
+#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
     init_os_extras();
 #endif
 
@@ -2244,7 +2245,7 @@ Perl_moreswitches(pTHX_ char *s)
        return s;
     case 'v':
        PerlIO_printf(PerlIO_stdout(),
-                     Perl_form(aTHX_ "\nThis is perl, v%vd built for %s",
+                     Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
                                PL_patchlevel, ARCHNAME));
 #if defined(LOCAL_PATCH_COUNT)
        if (LOCAL_PATCH_COUNT > 0)
@@ -3463,7 +3464,7 @@ S_init_perllib(pTHX)
 #endif /* MACOS_TRADITIONAL */
 }
 
-#if defined(DOSISH)
+#if defined(DOSISH) || defined(EPOC)
 #    define PERLLIB_SEP ';'
 #else
 #  if defined(VMS)
diff --git a/perl.h b/perl.h
index de5b8c5..9b963e1 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1064,6 +1064,11 @@ typedef UVTYPE UV;
 #define PTR2IV(p)      INT2PTR(IV,p)
 #define PTR2UV(p)      INT2PTR(UV,p)
 #define PTR2NV(p)      NUM2PTR(NV,p)
+#if PTRSIZE == LONGSIZE 
+#  define PTR2ul(p)    (unsigned long)(p)
+#else
+#  define PTR2ul(p)    INT2PTR(unsigned long,p)        
+#endif
   
 #ifdef USE_LONG_DOUBLE
 #  if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
@@ -1608,7 +1613,11 @@ typedef struct ptr_tbl PTR_TBL_t;
 #     endif
 #   endif
 # endif
-#endif         
+#endif
+
+#ifndef NO_ENVIRON_ARRAY
+#  define USE_ENVIRON_ARRAY
+#endif
 
 #ifndef PERL_SYS_INIT3
 #  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
@@ -1798,9 +1807,25 @@ typedef pthread_key_t    perl_key;
 #  endif 
 #endif
 
+#ifndef UVf
+#  ifdef CHECK_FORMAT
+#    define UVf UVuf
+#  else
+#    define UVf "Vu"
+#  endif 
+#endif
+
+#ifndef VDf
+#  ifdef CHECK_FORMAT
+#    define VDf "p"
+#  else
+#    define VDf "vd"
+#  endif 
+#endif
+
 /* Some unistd.h's give a prototype for pause() even though
    HAS_PAUSE ends up undefined.  This causes the #define
-   below to be rejected by the compmiler.  Sigh.
+   below to be rejected by the compiler.  Sigh.
 */
 #ifdef HAS_PAUSE
 #define Pause  pause
@@ -2020,6 +2045,7 @@ Gid_t getegid (void);
 
 #ifndef Perl_error_log
 #  define Perl_error_log       (PL_stderrgv                    \
+                                && GvIOp(PL_stderrgv)          \
                                 && IoOFP(GvIOp(PL_stderrgv))   \
                                 ? IoOFP(GvIOp(PL_stderrgv))    \
                                 : PerlIO_stderr())
@@ -2242,11 +2268,11 @@ EXT char *** environ_pointer;
 #  endif
 #else
    /* VMS and some other platforms don't use the environ array */
-#  if !defined(VMS)
+#  ifdef USE_ENVIRON_ARRAY
 #    if !defined(DONT_DECLARE_STD) || \
         (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
         defined(__sgi) || \
-        defined(__DGUX) || defined(EPOC)
+        defined(__DGUX) 
 extern char ** environ;        /* environment variables supplied via exec */
 #    endif
 #  endif
index 3257fec..87f9f74 100644 (file)
--- a/perlapi.c
+++ b/perlapi.c
@@ -3378,6 +3378,13 @@ Perl_utf8_to_uv(pTHXo_ U8 *s, I32* retlen)
     return ((CPerlObj*)pPerl)->Perl_utf8_to_uv(s, retlen);
 }
 
+#undef  Perl_utf8_to_uv_chk
+UV
+Perl_utf8_to_uv_chk(pTHXo_ U8 *s, I32* retlen, bool checking)
+{
+    return ((CPerlObj*)pPerl)->Perl_utf8_to_uv_chk(s, retlen, checking);
+}
+
 #undef  Perl_uv_to_utf8
 U8*
 Perl_uv_to_utf8(pTHXo_ U8 *d, UV uv)
index 81b1b05..e3c33d9 100644 (file)
@@ -22,7 +22,7 @@ if test -d pod; then
 fi
 POD=`echo *.pod`
 MAN=`echo $POD|sed 's/\.pod/\.man/g'`
-HTML=`echo $POD|sed 's/perltoc.pod//'|sed 's/\.pod/\.man/g'`
+HTML=`echo $POD|sed 's/perltoc.pod//'|sed 's/\.pod/\.html/g'`
 TEX=`echo $POD|sed 's/\.pod/\.tex/g'`
 
 echo "Extracting pod/Makefile (with variable substitutions)"
index b60a652..b9c3961 100644 (file)
@@ -1201,7 +1201,7 @@ Found in file sv.c
 Creates a new SV.  A non-zero C<len> parameter indicates the number of
 bytes of preallocated string space the SV should have.  An extra byte for a
 tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
-space is allocated.)  The reference count for the new SV is set to 1. 
+space is allocated.)  The reference count for the new SV is set to 1.
 C<id> is an integer id between 0 and 1299 (used to identify leaks).
 
        SV*     NEWSV(int id, STRLEN len)
@@ -2342,19 +2342,19 @@ false, defined or undefined.  Does not handle 'get' magic.
 =for hackers
 Found in file sv.h
 
-=item SvTYPE
-
-Returns the type of the SV.  See C<svtype>.
+=item svtype
 
-       svtype  SvTYPE(SV* sv)
+An enum of flags for Perl types.  These are found in the file B<sv.h> 
+in the C<svtype> enum.  Test these flags with the C<SvTYPE> macro.
 
 =for hackers
 Found in file sv.h
 
-=item svtype
+=item SvTYPE
 
-An enum of flags for Perl types.  These are found in the file B<sv.h> 
-in the C<svtype> enum.  Test these flags with the C<SvTYPE> macro.
+Returns the type of the SV.  See C<svtype>.
+
+       svtype  SvTYPE(SV* sv)
 
 =for hackers
 Found in file sv.h
@@ -3182,13 +3182,46 @@ Found in file utf8.c
 Converts a string C<s> of length C<len> from UTF8 into byte encoding.
 Unlike C<bytes_to_utf8>, this over-writes the original string, and
 updates len to contain the new length.
-Returns zero on failure leaving the string and len unchanged
+Returns zero on failure, setting C<len> to -1.
 
        U8 *    utf8_to_bytes(U8 *s, STRLEN *len)
 
 =for hackers
 Found in file utf8.c
 
+=item utf8_to_uv
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character, and the pointer C<s> will be
+advanced to the end of the character.
+
+If C<s> does not point to a well-formed UTF8 character, an optional UTF8
+warning is produced.
+
+       U8* s   utf8_to_uv(I32 *retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uv_chk
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character, and the pointer C<s> will be
+advanced to the end of the character.
+
+If C<s> does not point to a well-formed UTF8 character, the behaviour
+is dependent on the value of C<checking>: if this is true, it is
+assumed that the caller will raise a warning, and this function will
+set C<retlen> to C<-1> and return. If C<checking> is not true, an optional UTF8
+warning is produced.
+
+       U8* s   utf8_to_uv_chk(I32 *retlen, I32 checking)
+
+=for hackers
+Found in file utf8.c
+
 =item warn
 
 This is the XSUB-writer's interface to Perl's C<warn> function.  Use this
index 65689a6..50b6858 100644 (file)
@@ -540,6 +540,15 @@ has no effect.  Thus ((),(),()) is equivalent to ().  Similarly,
 interpolating an array with no elements is the same as if no
 array had been interpolated at that point.
 
+This interpolation combines with the facts that the opening
+and closing parentheses are optional (except necessary for
+precedence) and lists may end with an optional comma to mean that
+multiple commas within lists are legal syntax. The list C<1,,3> is a
+concatenation of two lists, C<1,> and C<3>, the first of which ends
+with that optional comma.  C<1,,3> is C<(1,),(3)> is C<1,3> (And
+similarly for C<1,,,3> is C<(1,),(,),3> is C<1,3> and so on.)  Not that
+we'd advise you to use this obfuscation.
+
 A list value may also be subscripted like a normal array.  You must
 put the list in parentheses to avoid ambiguity.  For example:
 
index 5812a40..742423b 100644 (file)
@@ -32,20 +32,22 @@ Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
 
 =item *
 
-The array C<@{"_<$filename"}> holds the lines of $filename for all
-files compiled by Perl.  The same for C<eval>ed strings that contain
+Each array C<@{"_<$filename"}> holds the lines of $filename for a
+file compiled by Perl.  The same for C<eval>ed strings that contain
 subroutines, or which are currently being executed.  The $filename
 for C<eval>ed strings looks like C<(eval 34)>.   Code assertions
-in regexes look like C<(re_eval 19)>.
+in regexes look like C<(re_eval 19)>.  
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
 
 =item *
 
-The hash C<%{"_<$filename"}> contains breakpoints and actions keyed
+Each hash C<%{"_<$filename"}> contains breakpoints and actions keyed
 by line number.  Individual entries (as opposed to the whole hash)
 are settable.  Perl only cares about Boolean true here, although
 the values used by F<perl5db.pl> have the form
-C<"$break_condition\0$action">.  Values in this hash are magical
-in numeric context: they are zeros if the line is not breakable.
+C<"$break_condition\0$action">.  
 
 The same holds for evaluated strings that contain subroutines, or
 which are currently being executed.  The $filename for C<eval>ed strings
@@ -53,7 +55,7 @@ looks like C<(eval 34)> or  C<(re_eval 19)>.
 
 =item *
 
-The scalar C<${"_<$filename"}> contains C<"_<$filename">.  This is
+Each scalar C<${"_<$filename"}> contains C<"_<$filename">.  This is
 also the case for evaluated strings that contain subroutines, or
 which are currently being executed.  The $filename for C<eval>ed
 strings looks like C<(eval 34)> or C<(re_eval 19)>.
index 9cd1a08..4ef5eca 100644 (file)
@@ -63,13 +63,13 @@ The layout on the cards was such that high bits were set for the
 upper and lower case alphabet characters [a-z] and [A-Z], but there
 were gaps within each latin alphabet range.
 
-=head2 13 variant characters
-
 Some IBM EBCDIC character sets may be known by character code set 
 identification numbers (CCSID numbers) or code page numbers.  Leading
 zero digits in CCSID numbers within this document are insignificant.
 E.g. CCSID 0037 may be referred to as 37 in places.
 
+=head2 13 variant characters
+
 Among IBM EBCDIC character code sets there are 13 characters that
 are often mapped to different integer values.  Those characters
 are known as the 13 "variant" characters and are:
@@ -106,14 +106,15 @@ extensions to ASCII have been labelled with character names roughly
 corresponding to I<The Unicode Standard, Version 2.0> albeit with 
 substitutions such as s/LATIN// and s/VULGAR// in all cases, 
 s/CAPITAL LETTER// in some cases, and s/SMALL LETTER ([A-Z])/\l$1/ 
-in some other cases.  The "names" of the C1 control set 
-(128..159 in ISO 8859-1) are somewhat arbitrary.  The differences 
-between the 0037 and 1047 sets are flagged with ***.  The differences 
-between the 1047 and POSIX-BC sets are flagged with ###.  
-All ord() numbers listed are decimal.  If you would rather see this 
-table listing octal values then run the table (that is, the pod 
-version of this document since this recipe may not work with 
-a pod2_other_format translation) through:
+in some other cases (the C<charnames> pragma names unfortunately do 
+not list explicit names for the C0 or C1 control characters).  The 
+"names" of the C1 control set (128..159 in ISO 8859-1) listed here are 
+somewhat arbitrary.  The differences between the 0037 and 1047 sets are 
+flagged with ***.  The differences between the 1047 and POSIX-BC sets 
+are flagged with ###.  All ord() numbers listed are decimal.  If you 
+would rather see this table listing octal values then run the table 
+(that is, the pod version of this document since this recipe may not 
+work with a pod2_other_format translation) through:
 
 =over 4
 
@@ -490,6 +491,8 @@ code page you can use the Config module like so:
 
 =head1 CONVERSIONS
 
+=head2 tr///
+
 In order to convert a string of characters from one character set to 
 another a simple list of numbers, such as in the right columns in the
 above table, along with perl's tr/// operator is all that is needed.  
@@ -519,13 +522,15 @@ column from the output of recipe 0 and use it in tr/// like so:
     '\060\061\062\063\064\065\066\067\070\071\263\333\334\331\332\237' ;
 
     my $ebcdic_string = $ascii_string;
-    $ebcdic_string = tr/\000-\377/$cp_037/;
+    eval '$ebcdic_string =~ tr/\000-\377/' . $cp_037 . '/';
 
 To convert from EBCDIC to ASCII just reverse the order of the tr/// 
 arguments like so:
 
     my $ascii_string = $ebcdic_string;
-    $ascii_string = tr/$code_page_chrs/\000-\037/;
+    eval '$ascii_string = tr/' . $code_page_chrs . '/\000-\037/';
+
+=head2 iconv
 
 XPG4 operability often implies the presence of an I<iconv> utility
 available from the shell or from the C library.  Consult your system's
@@ -544,6 +549,10 @@ or the inverse map:
 
 For other perl based conversion options see the Convert::* modules on CPAN.
 
+=head2 C RTL
+
+The OS/390 C run time library provides _atoe() and _etoa() functions.
+
 =head1 OPERATOR DIFFERENCES
 
 The C<..> range operator treats certain character ranges with 
@@ -895,11 +904,18 @@ connection.
 This strategy can employ a network connection.  As such
 it would be computationally expensive.
 
-=head1 URL ENCODING and DECODING
+=head1 TRANFORMATION FORMATS
+
+There are a variety of ways of transforming data with an intra character set 
+mapping that serve a variety of purposes.  Sorting was discussed in the 
+previous section and a few of the other more popular mapping techniques are 
+discussed next.
+
+=head2 URL decoding and encoding
 
 Note that some URLs have hexadecimal ASCII code points in them in an
-attempt to overcome character limitation issues.  For example the
-tilde character is not on every keyboard hence a URL of the form:
+attempt to overcome character or protocol limitation issues.  For example 
+the tilde character is not on every keyboard hence a URL of the form:
 
     http://www.pvhp.com/~pvhp/
 
@@ -934,6 +950,153 @@ of decoding such a URL under CCSID 1047:
     );
     $url =~ s/%([0-9a-fA-F]{2})/pack("c",$a2e_1047[hex($1)])/ge;
 
+Conversely, here is a partial solution for the task of encoding such 
+a URL under the 1047 code page:
+
+    $url = 'http://www.pvhp.com/~pvhp/';
+    # this array assumes code page 1047
+    my @e2a_1047 = (
+          0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
+         16, 17, 18, 19,157, 10,  8,135, 24, 25,146,143, 28, 29, 30, 31,
+        128,129,130,131,132,133, 23, 27,136,137,138,139,140,  5,  6,  7,
+        144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
+         32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+         38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+         45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+        248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+        216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+        176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+        181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+        172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+        123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+        125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+         92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+         48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+    );
+    # The following regular expression does not address the 
+    # mappings for: ('.' => '%2E', '/' => '%2F', ':' => '%3A') 
+    $url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/sprintf("%%%02X",$e2a_1047[ord($1)])/ge;
+
+where a more complete solution would split the URL into components 
+and apply a full s/// substitution only to the appropriate parts.
+
+In the remaining examples a @e2a or @a2e array may be employed
+but the assignment will not be shown explicitly.  For code page 1047
+you could use the @a2e_1047 or @e2a_1047 arrays just shown.
+
+=head2 uu encoding and decoding
+
+The C<u> template to pack() or unpack() will render EBCDIC data in EBCDIC 
+characters equivalent to their ASCII counterparts.  For example, the 
+following will print "Yes indeed\n" on either an ASCII or EBCDIC computer:
+
+    $all_byte_chrs = '';
+    for (0..255) { $all_byte_chrs .= chr($_); }
+    $uuencode_byte_chrs = pack('u', $all_byte_chrs);
+    ($uu = <<'    ENDOFHEREDOC') =~ s/^\s*//gm;
+    M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
+    M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
+    M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
+    MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
+    MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
+    ?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
+    ENDOFHEREDOC
+    if ($uuencode_byte_chrs eq $uu) {
+        print "Yes ";
+    }
+    $uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
+    if ($uudecode_byte_chrs eq $all_byte_chrs) {
+        print "indeed\n";
+    }
+
+Here is a very spartan uudecoder that will work on EBCDIC provided
+that the @e2a array is filled in appropriately:
+
+    #!/usr/local/bin/perl
+    @e2a = ( # this must be filled in
+           );
+    $_ = <> until ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
+    open(OUT, "> $file") if $file ne "";
+    while(<>) {
+        last if /^end/;
+        next if /[a-z]/;
+        next unless int(((($e2a[ord()] - 32 ) & 077) + 2) / 3) ==
+            int(length() / 4);
+        print OUT unpack("u", $_);
+    }
+    close(OUT);
+    chmod oct($mode), $file;
+
+
+=head2 Quoted-Printable encoding and decoding
+
+On ASCII encoded machines it is possible to strip characters outside of
+the printable set using:
+
+    # This QP encoder works on ASCII only
+    $qp_string =~ s/([=\x00-\x1F\x80-\xFF])/sprintf("=%02X",ord($1))/ge;
+
+Whereas a QP encoder that works on both ASCII and EBCDIC machines 
+would look somewhat like the following (where the EBCDIC branch @e2a 
+array is omitted for brevity):
+
+    if (ord('A') == 65) {    # ASCII
+        $delete = "\x7F";    # ASCII
+        @e2a = (0 .. 255)    # ASCII to ASCII identity map
+    }
+    else {                   # EBCDIC
+        $delete = "\x07";    # EBCDIC
+        @e2a =               # EBCDIC to ASCII map (as shown above)
+    }
+    $qp_string =~
+      s/([^ !"\#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~$delete])/sprintf("=%02X",$e2a[ord($1)])/ge;
+
+(although in production code the substitutions might be done
+in the EBCDIC branch with the @e2a array and separately in the 
+ASCII branch without the expense of the identity map).
+
+Such QP strings can be decoded with:
+
+    # This QP decoder is limited to ASCII only
+    $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;
+    $string =~ s/=[\n\r]+$//;
+
+Whereas a QP decoder that works on both ASCII and EBCDIC machines 
+would look somewhat like the following (where the @a2e array is
+omitted for brevity):
+
+    $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr $a2e[hex $1]/ge;
+    $string =~ s/=[\n\r]+$//;
+
+=head2 Caesarian cyphers
+
+The practice of shifting an alphabet one or more characters for encipherment
+dates back thousands of years and was explicitly detailed by Gaius Julius
+Caesar in his B<Gallic Wars> text.  A single alphabet shift is sometimes 
+referred to as a rotation and the shift amount is given as a number $n after
+the string 'rot' or "rot$n".  Rot0 and rot26 would designate identity maps 
+on the 26 letter English version of the Latin alphabet.  Rot13 has the 
+interesting property that alternate subsequent invocations are identity maps 
+(thus rot13 is its own non-trivial inverse in the group of 26 alphabet 
+rotations).  Hence the following is a rot13 encoder and decoder that will 
+work on ASCII and EBCDIC machines:
+
+    #!/usr/local/bin/perl
+
+    while(<>){
+        tr/n-za-mN-ZA-M/a-zA-Z/;
+        print;
+    }
+
+In one-liner form:
+
+    perl -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;print'
+
+
+=head1 Hashing order and checksums
+
+XXX
+
 =head1 I18N AND L10N
 
 Internationalization(I18N) and localization(L10N) are supported at least 
@@ -969,8 +1132,8 @@ Perl runs under Unix Systems Services or USS.
 
 =item chcp
 
-L<chcp> is supported as a shell utility for displaying and changing 
-one's code page.
+B<chcp> is supported as a shell utility for displaying and changing 
+one's code page.  See also L<chcp>.
 
 =item dataset access
 
@@ -984,9 +1147,10 @@ or:
 
 See also the OS390::Stdio module on CPAN.
 
-=item iconv
+=item OS/390 iconv
 
-L<iconv> is supported as both a shell utility and a C RTL routine.
+B<iconv> is supported as both a shell utility and a C RTL routine.
+See also the iconv(1) and iconv(3) manual pages.
 
 =item locales
 
@@ -1048,14 +1212,19 @@ Reference and Registry>, IBM SC09-2190-00, December 1996.
 & Technology, B<#26 Vol. 10 Issue 4>, August/September 1999;
 ISSN 1523-0309; Multilingual Computing Inc. Sandpoint ID, USA.
 
+B<Codes, Ciphers, and Other Cryptic and Clandestine Communication>
+Fred B. Wrixon, ISBN 1-57912-040-7, Black Dog & Leventhal Publishers,
+1998.
+
 =head1 AUTHOR
 
 Peter Prymmer pvhp@best.com wrote this in 1999 and 2000 
 with CCSID 0819 and 0037 help from Chris Leach and 
 AndrE<eacute> Pirard A.Pirard@ulg.ac.be as well as POSIX-BC 
 help from Thomas Dorner Thomas.Dorner@start.de.
-Thanks also to Philip Newton and Vickie Cooper.  Trademarks, registered 
-trademarks, service marks and registered service marks used in this 
-document are the property of their respective owners.
+Thanks also to Vickie Cooper, Philip Newton, William Raffloer, and 
+Joe Smith.  Trademarks, registered trademarks, service marks and 
+registered service marks used in this document are the property of 
+their respective owners.
 
 
index e6adf95..3abc1f7 100644 (file)
@@ -1283,13 +1283,156 @@ We end up with a patch looking a little like this:
 And finally, we submit it, with our rationale, to perl5-porters. Job
 done!
 
+=head1 EXTERNAL TOOLS FOR DEBUGGING PERL
+
+Sometimes it helps to use external tools while debugging and
+testing Perl.  This section tries to guide you through using
+some common testing and debugging tools with Perl.  This is
+meant as a guide to interfacing these tools with Perl, not
+as any kind of guide to the use of the tools themselves.
+
+=head2 Rational Software's Purify
+
+Purify is a commercial tool that is helpful in identifying
+memory overruns, wild pointers, memory leaks and other such
+badness.  Perl must be compiled in a specific way for
+optimal testing with Purify.  Purify is available under
+Windows NT, Solaris, HP-UX, SGI, and Siemens Unix.
+
+The only currently known leaks happen when there are
+compile-time errors within eval or require.  (Fixing these
+is non-trivial, unfortunately, but they must be fixed
+eventually.)
+
+=head2 Purify on Unix
+
+On Unix, Purify creates a new Perl binary.  To get the most
+benefit out of Purify, you should create the perl to Purify
+using:
+
+    sh Configure -Accflags=-DPURIFY -Doptimize='-g' \
+     -Uusemymalloc -Dusemultiplicity
+
+where these arguments mean:
+
+=over 4
+
+=item -Accflags=-DPURIFY
+
+Disables Perl's arena memory allocation functions, as well as
+forcing use of memory allocation functions derived from the
+system malloc.
+
+=item -Doptimize='-g'
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs.  Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=item -Uusemymalloc
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks.  Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item -Dusemultiplicity
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=back
+
+Once you've compiled a perl suitable for Purify'ing, then you
+can just:
+
+    make pureperl   
+
+which creates a binary named 'pureperl' that has been Purify'ed.
+This binary is used in place of the standard 'perl' binary
+when you want to debug Perl memory problems.
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run the Purify'ed
+perl as:
+
+    make pureperl
+    cd t
+    ../pureperl -I../lib harness 
+
+which would run Perl on test.pl and report any memory problems.
+
+Purify outputs messages in "Viewer" windows by default.  If
+you don't have a windowing environment or if you simply
+want the Purify output to unobtrusively go to a log file
+instead of to the interactive window, use these following
+options to output to the log file "perl.log":
+
+    setenv PURIFYOPTIONS "-chain-length=25 -windows=no \
+     -log-file=perl.log -append-logfile=yes"
+
+If you plan to use the "Viewer" windows, then you only need this option:
+
+    setenv PURIFYOPTIONS "-chain-length=25"
+
+=head2 Purify on NT
+
+Purify on Windows NT instruments the Perl binary 'perl.exe'
+on the fly.  There are several options in the makefile you
+should change to get the most use out of Purify:
+
+=over 4
+
+=item DEFINES
+
+You should add -DPURIFY to the DEFINES line so the DEFINES
+line looks something like:
+
+    DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) -DPURIFY=1 
+
+to disable Perl's arena memory allocation functions, as
+well as to force use of memory allocation functions derived
+from the system malloc.
+
+=item USE_MULTI = define
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=item #PERL_MALLOC = define
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks.  Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item CFG = Debug
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs.  Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=back
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run Purify as:
+
+    cd win32
+    make
+    cd ../t
+    purify ../perl -I../lib harness 
+
+which would instrument Perl in memory, run Perl on test.pl,
+then finally report any memory problems.
+
 =head2 CONCLUSION
 
 We've had a brief look around the Perl source, an overview of the stages
 F<perl> goes through when it's running your code, and how to use a
-debugger to poke at the Perl guts. Finally, we took a very simple
-problem and demonstrated how to solve it fully - with documentation,
-regression tests, and finally a patch for submission to p5p.
+debugger to poke at the Perl guts. We took a very simple problem and
+demonstrated how to solve it fully - with documentation, regression
+tests, and finally a patch for submission to p5p.  Finally, we talked
+about how to use external tools to debug and test Perl.
 
 I'd now suggest you read over those references again, and then, as soon
 as possible, get your hands dirty. The best way to learn is by doing,
index 6bec46b..a9a8756 100644 (file)
@@ -8,7 +8,7 @@ perlmod - Perl modules (packages and symbol tables)
 
 Perl provides a mechanism for alternative namespaces to protect
 packages from stomping on each other's variables.  In fact, there's
-really no such thing as a global variable in Perl .  The package
+really no such thing as a global variable in Perl.  The package
 statement declares the compilation unit as being in the given
 namespace.  The scope of the package declaration is from the
 declaration itself through the end of the enclosing block, C<eval>,
@@ -96,6 +96,12 @@ table lookups at compile time:
     local *main::foo    = *main::bar;
     local $main::{foo}  = $main::{bar};
 
+(Be sure to note the B<vast> difference between the second line above
+and C<local $main::foo = $main::bar>. The former is accessing the hash
+C<%main::>, which is the symbol table of package C<main>. The latter is
+simply assigning scalar C<$bar> in package C<main> to scalar C<$foo> of
+the same package.)
+
 You can use this to print out all the variables in a package, for
 instance.  The standard but antiquated F<dumpvar.pl> library and
 the CPAN module Devel::Symdump make use of this.
@@ -139,7 +145,7 @@ Another use of symbol tables is for making "constant" scalars.
 
     *PI = \3.14159265358979;
 
-Now you cannot alter $PI, which is probably a good thing all in all.
+Now you cannot alter C<$PI>, which is probably a good thing all in all.
 This isn't the same as a constant subroutine, which is subject to
 optimization at compile-time.  A constant subroutine is one prototyped
 to take no arguments and to return a constant expression.  See 
index 945d4f3..32eaa3c 100644 (file)
@@ -119,7 +119,7 @@ you increment a variable that is numeric, or that has ever been used in
 a numeric context, you get a normal increment.  If, however, the
 variable has been used in only string contexts since it was set, and
 has a value that is not the empty string and matches the pattern
-C</^[a-zA-Z]*[0-9]*$/>, the increment is done as a string, preserving each
+C</^[a-zA-Z]*[0-9]*\z/>, the increment is done as a string, preserving each
 character within its range, with carry:
 
     print ++($foo = '99');     # prints '100'
index 70b95b0..25e1371 100644 (file)
@@ -2012,7 +2012,7 @@ Neale Ferguson <neale@mailbox.tabnsw.com.au>,
 David J. Fiander <davidf@mks.com>,
 Paul Green <Paul_Green@stratus.com>,
 M.J.T. Guy <mjtg@cus.cam.ac.uk>,
-Jarkko Hietaniemi <jhi@iki.fi<gt>,
+Jarkko Hietaniemi <jhi@iki.fi>,
 Luther Huffman <lutherh@stratcom.com>,
 Nick Ing-Simmons <nick@ni-s.u-net.com>,
 Andreas J. KE<ouml>nig <koenig@kulturbox.de>,
index 98ab39c..d8fb12c 100644 (file)
@@ -577,7 +577,8 @@ recognized by the C preprocessor such as "if", "else", or "define".)
 
 enables rudimentary switch parsing for switches on the command
 line after the program name but before any filename arguments (or before
-a B<-->).  Any switch found there is removed from @ARGV and sets the
+an argument of B<-->).  This means you can have switches with two leading
+dashes (B<--help>).  Any switch found there is removed from @ARGV and sets the
 corresponding variable in the Perl program.  The following program
 prints "1" if the program is invoked with a B<-xyz> switch, and "abc"
 if it is invoked with B<-xyz=abc>.
@@ -585,6 +586,9 @@ if it is invoked with B<-xyz=abc>.
     #!/usr/bin/perl -s
     if ($xyz) { print "$xyz\n" }
 
+Do note that B<--help> creates the variable ${-help}, which is not compliant
+with C<strict refs>.
+
 =item B<-S>
 
 makes Perl use the PATH environment variable to search for the
index 496e5ff..3be9072 100644 (file)
@@ -3717,6 +3717,8 @@ C<!!!>, C<!!>, C<!>
 
 =item The OUTPUT: Keyword
 
+=item The NO_OUTPUT Keyword
+
 =item The CODE: Keyword
 
 =item The INIT: Keyword
@@ -3733,6 +3735,8 @@ C<!!!>, C<!!>, C<!>
 
 =item The INPUT: Keyword
 
+=item The IN/OUTLIST/IN_OUTLIST Keywords
+
 =item Variable-length Parameter Lists
 
 =item The C_ARGS: Keyword
@@ -3745,6 +3749,8 @@ C<!!!>, C<!!>, C<!>
 
 =item The CLEANUP: Keyword
 
+=item The POST_CALL: Keyword
+
 =item The BOOT: Keyword
 
 =item The VERSIONCHECK: Keyword
@@ -4129,38 +4135,40 @@ hv_iterval, hv_magic, hv_store, hv_store_ent, hv_undef, isALNUM, isALPHA,
 isDIGIT, isLOWER, isSPACE, isUPPER, items, ix, LEAVE, looks_like_number,
 MARK, mg_clear, mg_copy, mg_find, mg_free, mg_get, mg_length, mg_magical,
 mg_set, Move, New, newAV, Newc, newCONSTSUB, newHV, newRV_inc, newRV_noinc,
-NEWSV, newSViv, newSVnv, newSVpv, newSVpvf, newSVpvn, newSVrv, newSVsv,
-newSVuv, newXS, newXSproto, Newz, Nullav, Nullch, Nullcv, Nullhv, Nullsv,
-ORIGMARK, perl_alloc, perl_construct, perl_destruct, perl_free, perl_parse,
-perl_run, PL_DBsingle, PL_DBsub, PL_DBtrace, PL_dowarn, PL_modglobal,
-PL_na, PL_sv_no, PL_sv_undef, PL_sv_yes, POPi, POPl, POPn, POPp, POPs,
-PUSHi, PUSHMARK, PUSHn, PUSHp, PUSHs, PUSHu, PUTBACK, Renew, Renewc,
-require_pv, RETVAL, Safefree, savepv, savepvn, SAVETMPS, SP, SPAGAIN, ST,
-strEQ, strGE, strGT, strLE, strLT, strNE, strnEQ, strnNE, StructCopy,
-SvCUR, SvCUR_set, SvEND, SvGETMAGIC, SvGROW, SvIOK, SvIOKp, SvIOK_off,
-SvIOK_on, SvIOK_only, SvIV, SvIVX, SvLEN, SvNIOK, SvNIOKp, SvNIOK_off,
-SvNOK, SvNOKp, SvNOK_off, SvNOK_on, SvNOK_only, SvNV, SvNVX, SvOK, SvOOK,
-SvPOK, SvPOKp, SvPOK_off, SvPOK_on, SvPOK_only, SvPV, SvPVX, SvPV_force,
+NEWSV, newSViv, newSVnv, newSVpv, newSVpvf, newSVpvn, newSVpvn_share,
+newSVrv, newSVsv, newSVuv, newXS, newXSproto, Newz, Nullav, Nullch, Nullcv,
+Nullhv, Nullsv, ORIGMARK, perl_alloc, perl_construct, perl_destruct,
+perl_free, perl_parse, perl_run, PL_DBsingle, PL_DBsub, PL_DBtrace,
+PL_dowarn, PL_modglobal, PL_na, PL_sv_no, PL_sv_undef, PL_sv_yes, POPi,
+POPl, POPn, POPp, POPs, PUSHi, PUSHMARK, PUSHn, PUSHp, PUSHs, PUSHu,
+PUTBACK, Renew, Renewc, require_pv, RETVAL, Safefree, savepv, savepvn,
+SAVETMPS, SP, SPAGAIN, ST, strEQ, strGE, strGT, strLE, strLT, strNE,
+strnEQ, strnNE, StructCopy, SvCUR, SvCUR_set, SvEND, SvGETMAGIC, SvGROW,
+SvIOK, SvIOKp, SvIOK_notUV, SvIOK_off, SvIOK_on, SvIOK_only, SvIOK_only_UV,
+SvIOK_UV, SvIV, SvIVX, SvLEN, SvNIOK, SvNIOKp, SvNIOK_off, SvNOK, SvNOKp,
+SvNOK_off, SvNOK_on, SvNOK_only, SvNV, SvNVX, SvOK, SvOOK, SvPOK, SvPOKp,
+SvPOK_off, SvPOK_on, SvPOK_only, SvPOK_only_UTF8, SvPV, SvPVX, SvPV_force,
 SvPV_nolen, SvREFCNT, SvREFCNT_dec, SvREFCNT_inc, SvROK, SvROK_off,
 SvROK_on, SvRV, SvSETMAGIC, SvSetSV, SvSetSV_nosteal, SvSTASH, SvTAINT,
 SvTAINTED, SvTAINTED_off, SvTAINTED_on, SvTRUE, svtype, SvTYPE, SVt_IV,
-SVt_NV, SVt_PV, SVt_PVAV, SVt_PVCV, SVt_PVHV, SVt_PVMG, SvUPGRADE, SvUV,
-SvUVX, sv_2mortal, sv_bless, sv_catpv, sv_catpvf, sv_catpvf_mg, sv_catpvn,
-sv_catpvn_mg, sv_catpv_mg, sv_catsv, sv_catsv_mg, sv_chop, sv_clear,
-sv_cmp, sv_cmp_locale, sv_dec, sv_derived_from, sv_eq, sv_free, sv_gets,
-sv_grow, sv_inc, sv_insert, sv_isa, sv_isobject, sv_len, sv_len_utf8,
-sv_magic, sv_mortalcopy, sv_newmortal, sv_pvn_force, sv_pvutf8n_force,
-sv_reftype, sv_replace, sv_rvweaken, sv_setiv, sv_setiv_mg, sv_setnv,
-sv_setnv_mg, sv_setpv, sv_setpvf, sv_setpvf_mg, sv_setpviv, sv_setpviv_mg,
-sv_setpvn, sv_setpvn_mg, sv_setpv_mg, sv_setref_iv, sv_setref_nv,
-sv_setref_pv, sv_setref_pvn, sv_setsv, sv_setsv_mg, sv_setuv, sv_setuv_mg,
-sv_true, sv_unmagic, sv_unref, sv_upgrade, sv_usepvn, sv_usepvn_mg,
+SVt_NV, SVt_PV, SVt_PVAV, SVt_PVCV, SVt_PVHV, SVt_PVMG, SvUPGRADE, SvUTF8,
+SvUTF8_off, SvUTF8_on, SvUV, SvUVX, sv_2mortal, sv_bless, sv_catpv,
+sv_catpvf, sv_catpvf_mg, sv_catpvn, sv_catpvn_mg, sv_catpv_mg, sv_catsv,
+sv_catsv_mg, sv_chop, sv_clear, sv_cmp, sv_cmp_locale, sv_dec,
+sv_derived_from, sv_eq, sv_free, sv_gets, sv_grow, sv_inc, sv_insert,
+sv_isa, sv_isobject, sv_len, sv_len_utf8, sv_magic, sv_mortalcopy,
+sv_newmortal, sv_pvn_force, sv_pvutf8n_force, sv_reftype, sv_replace,
+sv_rvweaken, sv_setiv, sv_setiv_mg, sv_setnv, sv_setnv_mg, sv_setpv,
+sv_setpvf, sv_setpvf_mg, sv_setpviv, sv_setpviv_mg, sv_setpvn,
+sv_setpvn_mg, sv_setpv_mg, sv_setref_iv, sv_setref_nv, sv_setref_pv,
+sv_setref_pvn, sv_setsv, sv_setsv_mg, sv_setuv, sv_setuv_mg, sv_true,
+sv_unmagic, sv_unref, sv_upgrade, sv_usepvn, sv_usepvn_mg,
 sv_utf8_downgrade, sv_utf8_encode, sv_utf8_upgrade, sv_vcatpvfn,
-sv_vsetpvfn, THIS, toLOWER, toUPPER, U8 *s, utf8_to_bytes, warn, XPUSHi,
-XPUSHn, XPUSHp, XPUSHs, XPUSHu, XS, XSRETURN, XSRETURN_EMPTY, XSRETURN_IV,
-XSRETURN_NO, XSRETURN_NV, XSRETURN_PV, XSRETURN_UNDEF, XSRETURN_YES,
-XST_mIV, XST_mNO, XST_mNV, XST_mPV, XST_mUNDEF, XST_mYES, XS_VERSION,
-XS_VERSION_BOOTCHECK, Zero
+sv_vsetpvfn, THIS, toLOWER, toUPPER, U8 *s, utf8_to_bytes, utf8_to_uv,
+utf8_to_uv_chk, warn, XPUSHi, XPUSHn, XPUSHp, XPUSHs, XPUSHu, XS, XSRETURN,
+XSRETURN_EMPTY, XSRETURN_IV, XSRETURN_NO, XSRETURN_NV, XSRETURN_PV,
+XSRETURN_UNDEF, XSRETURN_YES, XST_mIV, XST_mNO, XST_mNV, XST_mPV,
+XST_mUNDEF, XST_mYES, XS_VERSION, XS_VERSION_BOOTCHECK, Zero
 
 =item AUTHORS
 
@@ -4168,7 +4176,7 @@ XS_VERSION_BOOTCHECK, Zero
 
 =back
 
-=head2 perlintern - autogenerated documentation of purely B<internal> 
+=head2 perlintern - autogenerated documentation of purely B<internal>
                 Perl functions
 
 =over
@@ -4573,6 +4581,22 @@ finish, print
 
 =item Patching
 
+=back
+
+=item EXTERNAL TOOLS FOR DEBUGGING PERL
+
+=over
+
+=item Rational Software's Purify
+
+=item Purify on Unix
+
+-Accflags=-DPURIFY, -Doptimize='-g', -Uusemymalloc, -Dusemultiplicity
+
+=item Purify on NT
+
+DEFINES, USE_MULTI = define, #PERL_MALLOC = define, CFG = Debug
+
 =item CONCLUSION
 
 I<The Road goes ever on and on, down from the door where it began.>
@@ -4641,6 +4665,15 @@ I<The Road goes ever on and on, down from the door where it began.>
 
 =item Performance Enhancements
 
+sort() has been changed to use mergesort internally as opposed to the
+earlier quicksort.  For very small lists this may result in slightly slower
+sorting times, but in general the speedup should be at least 20%. 
+Additional bonuses are that the worst case behaviour of sort() is now
+better (in computer science terms it now runs in time O(N log N), as
+opposed to quicksort's Theta(N**2) worst-case run time behaviour), and that
+sort() is now stable (meaning that elements with identical keys will stay
+ordered as they were before the sort)
+
 =item Installation and Configuration Improvements
 
 =over
@@ -6201,6 +6234,18 @@ FETCH_I<type>_ATTRIBUTES, MODIFY_I<type>_ATTRIBUTES
 
 =back
 
+=head2 attrs - set/get attributes of a subroutine (deprecated)
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+method, locked
+
+=back
+
 =head2 autouse - postpone load of modules until a function is used
 
 =over
@@ -6420,6 +6465,18 @@ operations
 
 =back
 
+=head2 ops - Perl pragma to restrict unsafe operations when compiling
+
+=over
+
+=item SYNOPSIS 
+
+=item DESCRIPTION
+
+=item SEE ALSO
+
+=back
+
 =head2 overload - Package for overloading perl operations
 
 =over
@@ -6461,7 +6518,7 @@ is inherited by derived classes
 
 =item Last Resort
 
-=item Fallback 
+=item Fallback
 
 C<undef>, TRUE, defined, but FALSE
 
@@ -6874,7 +6931,7 @@ bytecode
 
 B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>,
 B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-On>, B<-D>, B<-Do>,
-B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-Ppackage>    Stores package in the
+B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-upackage>    Stores package in the
 output.    =back
 
 =item EXAMPLES
@@ -7176,7 +7233,7 @@ STYLE ] ), cmpthese ( RESULTSHASHREF ), countit(TIME, CODE), disablecache (
 
 B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>,
 B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-On>, B<-D>, B<-Do>,
-B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-Ppackage>    Stores package in the
+B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-upackage>    Stores package in the
 output.    =back
 
 =item EXAMPLES
@@ -7918,7 +7975,7 @@ C<gidtype>, C<glibpth>, C<grep>, C<groupcat>, C<groupstype>, C<gzip>
 
 =item h
 
-C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>, C<huge>
+C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>
 
 =item i
 
@@ -7942,9 +7999,10 @@ C<i_varargs>, C<i_varhdr>, C<i_vfork>, C<ignore_versioned_solibs>,
 C<inc_version_list>, C<inc_version_list_init>, C<incpath>, C<inews>,
 C<installarchlib>, C<installbin>, C<installman1dir>, C<installman3dir>,
 C<installprefix>, C<installprefixexp>, C<installprivlib>, C<installscript>,
-C<installsitearch>, C<installsitebin>, C<installsitelib>, C<installstyle>,
-C<installusrbinperl>, C<installvendorarch>, C<installvendorbin>,
-C<installvendorlib>, C<intsize>, C<ivdformat>, C<ivsize>, C<ivtype>
+C<installscripts>, C<installsitearch>, C<installsitebin>,
+C<installsitelib>, C<installstyle>, C<installusrbinperl>,
+C<installvendorarch>, C<installvendorbin>, C<installvendorlib>, C<intsize>,
+C<ivdformat>, C<ivsize>, C<ivtype>
 
 =item k
 
@@ -7952,12 +8010,12 @@ C<known_extensions>, C<ksh>
 
 =item l
 
-C<large>, C<ld>, C<lddlflags>, C<ldflags>, C<ldflags_uselargefiles>,
-C<ldlibpthname>, C<less>, C<lib_ext>, C<libc>, C<libperl>, C<libpth>,
-C<libs>, C<libsdirs>, C<libsfiles>, C<libsfound>, C<libspath>,
-C<libswanted>, C<libswanted_uselargefiles>, C<line>, C<lint>, C<lkflags>,
-C<ln>, C<lns>, C<locincpth>, C<loclibpth>, C<longdblsize>, C<longlongsize>,
-C<longsize>, C<lp>, C<lpr>, C<ls>, C<lseeksize>, C<lseektype>
+C<ld>, C<lddlflags>, C<ldflags>, C<ldflags_uselargefiles>, C<ldlibpthname>,
+C<less>, C<lib_ext>, C<libc>, C<libperl>, C<libpth>, C<libs>, C<libsdirs>,
+C<libsfiles>, C<libsfound>, C<libspath>, C<libswanted>,
+C<libswanted_uselargefiles>, C<line>, C<lint>, C<lkflags>, C<ln>, C<lns>,
+C<locincpth>, C<loclibpth>, C<longdblsize>, C<longlongsize>, C<longsize>,
+C<lp>, C<lpr>, C<ls>, C<lseeksize>, C<lseektype>
 
 =item m
 
@@ -7967,9 +8025,8 @@ C<man3direxp>, C<man3ext>
 
 =item M
 
-C<Mcc>, C<medium>, C<mips_type>, C<mkdir>, C<mmaptype>, C<models>,
-C<modetype>, C<more>, C<multiarch>, C<mv>, C<myarchname>, C<mydomain>,
-C<myhostname>, C<myuname>
+C<Mcc>, C<mips_type>, C<mkdir>, C<mmaptype>, C<modetype>, C<more>,
+C<multiarch>, C<mv>, C<myarchname>, C<mydomain>, C<myhostname>, C<myuname>
 
 =item n
 
@@ -7991,9 +8048,9 @@ C<perl>
 =item P
 
 C<PERL_REVISION>, C<PERL_SUBVERSION>, C<PERL_VERSION>, C<perladmin>,
-C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>, C<pm_apiversion>,
-C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>, C<privlibexp>,
-C<prototype>, C<ptrsize>
+C<perllibs>, C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>,
+C<pm_apiversion>, C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>,
+C<privlibexp>, C<prototype>, C<ptrsize>
 
 =item q
 
@@ -8012,15 +8069,14 @@ C<shmattype>, C<shortsize>, C<shrpenv>, C<shsharp>, C<sig_count>,
 C<sig_name>, C<sig_name_init>, C<sig_num>, C<sig_num_init>, C<signal_t>,
 C<sitearch>, C<sitearchexp>, C<sitebin>, C<sitebinexp>, C<sitelib>,
 C<sitelib_stem>, C<sitelibexp>, C<siteprefix>, C<siteprefixexp>,
-C<sizesize>, C<sizetype>, C<sleep>, C<smail>, C<small>, C<so>,
-C<sockethdr>, C<socketlib>, C<socksizetype>, C<sort>, C<spackage>,
-C<spitshell>, C<split>, C<sPRId64>, C<sPRIeldbl>, C<sPRIEUldbl>,
-C<sPRIfldbl>, C<sPRIFUldbl>, C<sPRIgldbl>, C<sPRIGUldbl>, C<sPRIi64>,
-C<sPRIo64>, C<sPRIu64>, C<sPRIx64>, C<sPRIXU64>, C<src>, C<sSCNfldbl>,
-C<ssizetype>, C<startperl>, C<startsh>, C<static_ext>, C<stdchar>,
-C<stdio_base>, C<stdio_bufsiz>, C<stdio_cnt>, C<stdio_filbuf>,
-C<stdio_ptr>, C<stdio_stream_array>, C<strings>, C<submit>, C<subversion>,
-C<sysman>
+C<sizesize>, C<sizetype>, C<sleep>, C<smail>, C<so>, C<sockethdr>,
+C<socketlib>, C<socksizetype>, C<sort>, C<spackage>, C<spitshell>,
+C<sPRId64>, C<sPRIeldbl>, C<sPRIEUldbl>, C<sPRIfldbl>, C<sPRIFUldbl>,
+C<sPRIgldbl>, C<sPRIGUldbl>, C<sPRIi64>, C<sPRIo64>, C<sPRIu64>,
+C<sPRIx64>, C<sPRIXU64>, C<src>, C<sSCNfldbl>, C<ssizetype>, C<startperl>,
+C<startsh>, C<static_ext>, C<stdchar>, C<stdio_base>, C<stdio_bufsiz>,
+C<stdio_cnt>, C<stdio_filbuf>, C<stdio_ptr>, C<stdio_stream_array>,
+C<strings>, C<submit>, C<subversion>, C<sysman>
 
 =item t
 
@@ -8435,6 +8491,28 @@ Perl code
 
 =back
 
+=head2 Encode - character encodings
+
+=over
+
+=item TERMINOLOGY
+
+=item bytes
+
+=item chars
+
+=item chars With Encoding
+
+=item Testing For UTF-8
+
+=item Toggling UTF-8-ness
+
+=item UTF-16 and UTF-32 Encodings
+
+=item Handling Malformed Data
+
+=back
+
 =head2 English - use nice English (or awk) names for ugly punctuation
 variables
 
@@ -8463,6 +8541,22 @@ arrays
 
 =back
 
+=head2 Errno - System errno constants
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item CAVEATS
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
 =head2 Exporter - Implements default import method for modules
 
 =over
@@ -10340,6 +10434,28 @@ hostpath(), peerpath()
 
 =back
 
+=head2 IPC::Msg - SysV Msg IPC object class
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set
+( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [,
+FLAGS ] ), stat
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
 =head2 IPC::Open2, open2 - open a process for both reading and writing
 
 =over
@@ -10367,6 +10483,29 @@ handling
 
 =back
 
+=head2 IPC::Semaphore - SysV Semaphore IPC object class
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item METHODS
+
+new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ),
+getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ),
+set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
+, VALUE ), stat
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item COPYRIGHT
+
+=back
+
 =head2 IPC::SysV - SysV IPC constants
 
 =over
@@ -11423,12 +11562,13 @@ B<_clean_latex_commands>
 
 =item DESCRIPTION
 
-center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, release,
-section
+center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, quotes,
+release, section
 
 =item DIAGNOSTICS
 
-roff font should be 1 or 2 chars, not `%s', Invalid link %s, Unknown escape
+roff font should be 1 or 2 chars, not "%s", Invalid link %s, Invalid quote
+specification "%s", %s:%d: Unknown command paragraph "%s", Unknown escape
 EE<lt>%sE<gt>, Unknown sequence %s, %s: Unknown command paragraph "%s" on
 line %d, Unmatched =back
 
@@ -11918,12 +12058,13 @@ B<-output>, B<-sections>, B<-ranges>
 
 =item DESCRIPTION
 
-alt, indent, loose, sentence, width
+alt, indent, loose, quotes, sentence, width
 
 =item DIAGNOSTICS
 
-Bizarre space in item, Can't open %s for reading: %s, Unknown escape: %s,
-Unknown sequence: %s, Unmatched =back
+Bizarre space in item, Can't open %s for reading: %s, Invalid quote
+specification "%s", %s:%d: Unknown command paragraph "%s", Unknown escape:
+%s, Unknown sequence: %s, Unmatched =back
 
 =item RESTRICTIONS
 
@@ -12018,6 +12159,39 @@ C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
 
 =back
 
+=head2 Safe - Compile and execute code in restricted compartments
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+a new namespace, an operator mask
+
+=item WARNING
+
+=over
+
+=item RECENT CHANGES
+
+=item Methods in class Safe
+
+permit (OP, ...), permit_only (OP, ...), deny (OP, ...), deny_only (OP,
+...), trap (OP, ...), untrap (OP, ...), share (NAME, ...), share_from
+(PACKAGE, ARRAYREF), varglob (VARNAME), reval (STRING), rdo (FILENAME),
+root (NAMESPACE), mask (MASK)
+
+=item Some Safety Issues
+
+Memory, CPU, Snooping, Signals, State Changes
+
+=item AUTHOR
+
+=back
+
+=back
+
 =head2 Search::Dict, look - search for key in dictionary file
 
 =over
@@ -12111,6 +12285,8 @@ pack_sockaddr_un PATH, unpack_sockaddr_un SOCKADDR_UN
 
 =item MEMORY STORE
 
+=item ADVISORY LOCKING
+
 =item SPEED
 
 =item CANONICAL REPRESENTATION
@@ -12175,6 +12351,27 @@ C<Storable::is_retrieving>
 
 =back
 
+=head2 Syslog, Sys::Syslog, openlog, closelog, setlogmask, syslog - Perl
+interface to the UNIX syslog(3) calls
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+openlog $ident, $logopt, $facility, syslog $priority, $format, @args,
+setlogmask $mask_priority, setlogsock $sock_type (added in 5.004_02),
+closelog
+
+=item EXAMPLES
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=back
+
 =head2 Syslog::Syslog, Sys::Syslog, openlog, closelog, setlogmask, syslog -
 Perl interface to the UNIX syslog(3) calls
 
index d862e9a..781afe6 100644 (file)
@@ -166,21 +166,37 @@ argument and returns a single value.
      sin(x)
        double x
 
-When using parameters with C pointer types, as in
+Optionally, one can merge the description of types and the list of
+argument names, rewriting this as
 
-     double string_to_double(char *s);
+     double
+     sin(double x)
+
+This makes this XSUB look similar to an ANSI C declaration.  An optional
+semicolon is allowed after the argument list, as in
+
+     double
+     sin(double x);
+
+Parameters with C pointer types can have different semantic: C functions
+with similar declarations
 
-there may be two ways to describe this argument to B<xsubpp>:
+     bool string_looks_as_a_number(char *s);
+     bool make_char_uppercase(char *c);
+
+are used in absolutely incompatible manner.  Parameters to these functions
+could be described B<xsubpp> like this:
 
      char *  s
-     char    &s
+     char    &c
 
 Both these XS declarations correspond to the C<char*> C type, but they have
-different semantics.  It is convenient to think that the indirection operator
+different semantics, see L<"The & Unary Operator">.
+
+It is convenient to think that the indirection operator
 C<*> should be considered as a part of the type and the address operator C<&>
-should be considered part of the variable.  See L<"The Typemap"> and
-L<"The & Unary Operator"> for more info about handling qualifiers and unary
-operators in C types.
+should be considered part of the variable.  See L<"The Typemap">
+for more info about handling qualifiers and unary operators in C types.
 
 The function name and the return type must be placed on
 separate lines and should be flush left-adjusted.
@@ -191,7 +207,7 @@ separate lines and should be flush left-adjusted.
     double x                       sin(x)
                                     double x
 
-The function body may be indented or left-adjusted.  The following example
+The rest of the function description may be indented or left-adjusted.  The following example
 shows a function with its body left-adjusted.  Most examples in this
 document will indent the body for better readability.
 
@@ -364,6 +380,31 @@ Likewise,  C<SETMAGIC: ENABLE> can be used to reenable it for the
 remainder of the OUTPUT section.  See L<perlguts> for more details
 about 'set' magic.
 
+=head2 The NO_OUTPUT Keyword
+
+The NO_OUTPUT can be placed as the first token of the XSUB.  This keyword
+indicates that while the C subroutine we provide an interface to has
+a non-C<void> return type, the return value of this C subroutine should not
+be returned from the generated Perl subroutine.
+
+With this keyword present L<The RETVAL Variable> is created, and in the
+generated call to the subroutine this variable is assigned to, but the value
+of this variable is not going to be used in the auto-generated code.
+
+This keyword makes sense only if C<RETVAL> is going to be accessed by the
+user-supplied code.  It is especially useful to make a function interface
+more Perl-like, especially when the C return value is just an error condition
+indicator.  For example,
+
+  NO_OUTPUT int
+  delete_file(char *name)
+    POST_CALL:
+      if (RETVAL != 0)
+         croak("Error %d while deleting file '%s'", RETVAL, name);
+
+Here the generated XS function returns nothing on success, and will die()
+with a meaningful error message on error.
+
 =head2 The CODE: Keyword
 
 This keyword is used in more complicated XSUBs which require
@@ -713,6 +754,70 @@ thus C<host> is initialized on the declaration line, and our assignment
 C<h = host> is not performed too early.  Otherwise one would need to have the
 assignment C<h = host> in a CODE: or INIT: section.)
 
+=head2 The IN/OUTLIST/IN_OUTLIST Keywords
+
+In the list of parameters for an XSUB, one can precede parameter names
+by the C<IN>/C<OUTLIST>/C<IN_OUTLIST> keywords.  C<IN> keyword is a default,
+the other two keywords indicate how the Perl interface should differ from
+the C interface.
+
+Parameters preceded by C<OUTLIST>/C<IN_OUTLIST> keywords are considered to
+be used by the C subroutine I<via pointers>.  C<OUTLIST> keyword indicates
+that the C subroutine does not inspect the memory pointed by this parameter,
+but will write through this pointer to provide additional return values.
+Such parameters do not appear in the usage signature of the generated Perl
+function.
+
+Parameters preceded by C<IN_OUTLIST> I<do> appear as parameters to the
+Perl function.  These parameters are converted to the corresponding C type,
+then pointers to these data are given as arguments to the C function.  It
+is expected that the C function will write through these pointers 
+
+The return list of the generated Perl function consists of the C return value
+from the function (unless the XSUB is of C<void> return type or
+C<The NO_INIT Keyword> was used) followed by all the C<OUTLIST>
+and C<IN_OUTLIST> parameters (in the order of appearence).  Say, an XSUB
+
+  void
+  day_month(OUTLIST day, IN unix_time, OUTLIST month)
+    int day
+    int unix_time
+    int month
+
+should be used from Perl as
+
+  my ($day, $month) = day_month(time);
+
+The C signature of the corresponding function should be
+
+  void day_month(int *day, int unix_time, int *month);
+
+The C<in>/C<OUTLIST>/C<IN_OUTLIST> keywords can be mixed with ANSI-style
+declarations, as in
+
+  void
+  day_month(OUTLIST int day, int unix_time, OUTLIST int month)
+
+(here the optional C<IN> keyword is omitted).
+
+The C<IN_OUTLIST> parameters are somewhat similar to parameters introduced
+with L<The & Unary Operator> and put into the C<OUTPUT:> section (see
+L<The OUTPUT: Keyword>).  Say, the same C function can be interfaced with as
+
+  void
+  day_month(day, unix_time, month)
+      int &day = NO_INIT
+      int  unix_time
+      int &month = NO_INIT
+    OUTPUT:
+      day
+      month
+
+However, the generated Perl function is called in very C-ish style:
+
+  my ($day, $month);
+  day_month($day, time, $month);
+
 =head2 Variable-length Parameter Lists
 
 XSUBs can have variable-length parameter lists by specifying an ellipsis
@@ -927,14 +1032,14 @@ rewrite this example as:
        OUTPUT:
          RETVAL
 
-In fact, one can put this check into a CLEANUP: section as well.  Together
+In fact, one can put this check into a POST_CALL: section as well.  Together
 with PREINIT: simplifications, this leads to:
 
      int
      rpcb_gettime(host)
           char *host
           time_t  timep;
-       CLEANUP:
+       POST_CALL:
          if (RETVAL == 0)
                XSRETURN_UNDEF;
 
@@ -955,6 +1060,16 @@ any CODE:, PPCODE:, or OUTPUT: blocks which are present in the XSUB.  The
 code specified for the cleanup block will be added as the last statements
 in the XSUB.
 
+=head2 The POST_CALL: Keyword
+
+This keyword can be used when an XSUB requires special procedures
+executed after the C subroutine call is performed.  When the POST_CALL:
+keyword is used it must precede OUTPUT: and CLEANUP: blocks which are
+present in the XSUB.
+
+The POST_CALL: block does not make a lot of sense when the C subroutine
+call is supplied by user by providing either CODE: or PPCODE: section.
+
 =head2 The BOOT: Keyword
 
 The BOOT: keyword is used to add code to the extension's bootstrap
@@ -1235,7 +1350,7 @@ C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
 =head2 Inserting Comments and C Preprocessor Directives
 
 C preprocessor directives are allowed within BOOT:, PREINIT: INIT:,
-CODE:, PPCODE:, and CLEANUP: blocks, as well as outside the functions.
+CODE:, PPCODE:, POST_CALL:, and CLEANUP: blocks, as well as outside the functions.
 Comments are allowed anywhere after the MODULE keyword.  The compiler
 will pass the preprocessor directives through untouched and will remove
 the commented lines.
@@ -1390,7 +1505,7 @@ of failure.  They may be
 candidates to return undef or an empty list in case of failure.  If the
 failure may be detected without a call to the C function, you may want to use
 an INIT: section to report the failure.  For failures detectable after the C
-function returns one may want to use a CLEANUP: section to process the
+function returns one may want to use a POST_CALL: section to process the
 failure.  In more complicated cases use CODE: or PPCODE: sections.
 
 If many functions use the same failure indication based on the return value,
diff --git a/pp.c b/pp.c
index dade2ad..24b2b99 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2188,7 +2188,7 @@ PP(pp_ord)
     I32 retlen;
 
     if ((*tmps & 0x80) && DO_UTF8(tmpsv))
-       value = utf8_to_uv(tmps, &retlen);
+       value = utf8_to_uv_chk(tmps, &retlen, 0);
     else
        value = (UV)(*tmps & 255);
     XPUSHu(value);
@@ -2255,7 +2255,7 @@ PP(pp_ucfirst)
        I32 ulen;
        U8 tmpbuf[UTF8_MAXLEN];
        U8 *tend;
-       UV uv = utf8_to_uv(s, &ulen);
+       UV uv = utf8_to_uv_chk(s, &ulen, 0);
 
        if (PL_op->op_private & OPpLOCALE) {
            TAINT;
@@ -2314,7 +2314,7 @@ PP(pp_lcfirst)
        I32 ulen;
        U8 tmpbuf[UTF8_MAXLEN];
        U8 *tend;
-       UV uv = utf8_to_uv(s, &ulen);
+       UV uv = utf8_to_uv_chk(s, &ulen, 0);
 
        if (PL_op->op_private & OPpLOCALE) {
            TAINT;
@@ -2391,7 +2391,7 @@ PP(pp_uc)
                TAINT;
                SvTAINTED_on(TARG);
                while (s < send) {
-                   d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
+                   d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv_chk(s, &ulen, 0)));
                    s += ulen;
                }
            }
@@ -2465,7 +2465,7 @@ PP(pp_lc)
                TAINT;
                SvTAINTED_on(TARG);
                while (s < send) {
-                   d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
+                   d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv_chk(s, &ulen, 0)));
                    s += ulen;
                }
            }
@@ -3607,7 +3607,7 @@ PP(pp_unpack)
                len = strend - s;
            if (checksum) {
                while (len-- > 0 && s < strend) {
-                   auint = utf8_to_uv((U8*)s, &along);
+                   auint = utf8_to_uv_chk((U8*)s, &along, 0);
                    s += along;
                    if (checksum > 32)
                        cdouble += (NV)auint;
@@ -3619,7 +3619,7 @@ PP(pp_unpack)
                EXTEND(SP, len);
                EXTEND_MORTAL(len);
                while (len-- > 0 && s < strend) {
-                   auint = utf8_to_uv((U8*)s, &along);
+                   auint = utf8_to_uv_chk((U8*)s, &along, 0);
                    s += along;
                    sv = NEWSV(37, 0);
                    sv_setuv(sv, (UV)auint);
@@ -4038,7 +4038,7 @@ PP(pp_unpack)
                        char *t;
                        STRLEN n_a;
 
-                       sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
+                       sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
                        while (s < strend) {
                            sv = mul128(sv, *s & 0x7f);
                            if (!(*s++ & 0x80)) {
@@ -4967,6 +4967,7 @@ PP(pp_split)
     AV *ary;
     register I32 limit = POPi;                 /* note, negative is forever */
     SV *sv = POPs;
+    bool isutf = DO_UTF8(sv);
     STRLEN len;
     register char *s = SvPV(sv, len);
     char *strend = s + len;
@@ -5069,6 +5070,8 @@ PP(pp_split)
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
                sv_2mortal(dstr);
+           if (isutf)
+               (void)SvUTF8_on(dstr);
            XPUSHs(dstr);
 
            s = m + 1;
@@ -5089,6 +5092,8 @@ PP(pp_split)
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
                sv_2mortal(dstr);
+           if (isutf)
+               (void)SvUTF8_on(dstr);
            XPUSHs(dstr);
            s = m;
        }
@@ -5112,6 +5117,8 @@ PP(pp_split)
                sv_setpvn(dstr, s, m-s);
                if (make_mortal)
                    sv_2mortal(dstr);
+               if (isutf)
+                   (void)SvUTF8_on(dstr);
                XPUSHs(dstr);
                s = m + 1;
            }
@@ -5127,6 +5134,8 @@ PP(pp_split)
                sv_setpvn(dstr, s, m-s);
                if (make_mortal)
                    sv_2mortal(dstr);
+               if (isutf)
+                   (void)SvUTF8_on(dstr);
                XPUSHs(dstr);
                s = m + len;            /* Fake \n at the end */
            }
@@ -5154,6 +5163,8 @@ PP(pp_split)
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
                sv_2mortal(dstr);
+           if (isutf)
+               (void)SvUTF8_on(dstr);
            XPUSHs(dstr);
            if (rx->nparens) {
                for (i = 1; i <= rx->nparens; i++) {
@@ -5167,6 +5178,8 @@ PP(pp_split)
                        dstr = NEWSV(33, 0);
                    if (make_mortal)
                        sv_2mortal(dstr);
+                   if (isutf)
+                       (void)SvUTF8_on(dstr);
                    XPUSHs(dstr);
                }
            }
@@ -5185,6 +5198,8 @@ PP(pp_split)
        sv_setpvn(dstr, s, strend-s);
        if (make_mortal)
            sv_2mortal(dstr);
+       if (isutf)
+           (void)SvUTF8_on(dstr);
        XPUSHs(dstr);
        iters++;
     }
diff --git a/pp.sym b/pp.sym
index 0e6c056..42b29f6 100644 (file)
--- a/pp.sym
+++ b/pp.sym
@@ -40,6 +40,7 @@ Perl_ck_sort
 Perl_ck_spair
 Perl_ck_split
 Perl_ck_subr
+Perl_ck_substr
 Perl_ck_svconst
 Perl_ck_trunc
 Perl_pp_null
index 45f9a7e..b72c422 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1417,6 +1417,12 @@ Perl_die_where(pTHX_ char *message, STRLEN msglen)
 
            LEAVE;
 
+           /* LEAVE could clobber PL_curcop (see save_re_context())
+            * XXX it might be better to find a way to avoid messing with
+            * PL_curcop in save_re_context() instead, but this is a more
+            * minimal fix --GSAR */
+           PL_curcop = cx->blk_oldcop;
+
            if (optype == OP_REQUIRE) {
                char* msg = SvPVx(ERRSV, n_a);
                DIE(aTHX_ "%sCompilation failed in require",
@@ -2728,7 +2734,9 @@ S_doeval(pTHX_ int gimme, OP** startop)
     AV* comppadlist;
     I32 i;
 
-    PL_in_eval = EVAL_INEVAL;
+    PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
+                 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
+                 : EVAL_INEVAL);
 
     PUSHMARK(SP);
 
@@ -2891,6 +2899,7 @@ S_doeval(pTHX_ int gimme, OP** startop)
     CvDEPTH(PL_compcv) = 1;
     SP = PL_stack_base + POPMARK;              /* pop original mark */
     PL_op = saveop;                    /* The caller may need it. */
+    PL_lex_state = LEX_NOTPARSING;     /* $^S needs this. */
 #ifdef USE_THREADS
     MUTEX_LOCK(&PL_eval_mutex);
     PL_eval_owner = 0;
@@ -2959,13 +2968,13 @@ PP(pp_require)
            U8 *s = (U8*)SvPVX(sv);
            U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
            if (s < end) {
-               rev = utf8_to_uv(s, &len);
+               rev = utf8_to_uv_chk(s, &len, 0);
                s += len;
                if (s < end) {
-                   ver = utf8_to_uv(s, &len);
+                   ver = utf8_to_uv_chk(s, &len, 0);
                    s += len;
                    if (s < end)
-                       sver = utf8_to_uv(s, &len);
+                       sver = utf8_to_uv_chk(s, &len, 0);
                }
            }
            if (PERL_REVISION < rev
index b143814..c7a0b80 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -146,9 +146,17 @@ PP(pp_concat)
     dPOPTOPssrl;
     STRLEN len;
     U8 *s;
-    bool left_utf = DO_UTF8(left);
-    bool right_utf = DO_UTF8(right);
+    bool left_utf;
+    bool right_utf;
 
+    if (TARG == right && SvGMAGICAL(right))
+        mg_get(right);
+    if (SvGMAGICAL(left))
+        mg_get(left);
+
+    left_utf  = DO_UTF8(left);
+    right_utf = DO_UTF8(right);
     if (left_utf != right_utf) {
         if (TARG == right && !right_utf) {
             sv_utf8_upgrade(TARG); /* Now straight binary copy */
@@ -159,11 +167,15 @@ PP(pp_concat)
             U8 *l, *c, *olds = NULL;
             STRLEN targlen;
            s = (U8*)SvPV(right,len);
+           right_utf |= DO_UTF8(right);
             if (TARG == right) {
                /* Take a copy since we're about to overwrite TARG */
                olds = s = (U8*)savepvn((char*)s, len);
            }
+           if (!SvOK(left) && SvTYPE(left) <= SVt_PVMG)
+               sv_setpv(left, "");     /* Suppress warning. */
             l = (U8*)SvPV(left, targlen);
+           left_utf |= DO_UTF8(left);