Raphael Manfredi <Raphael.Manfredi@pobox.com>
Raul Dias <raul@dias.com.br>
Raymund Will <ray@caldera.de>
+Redvers Davies <red@criticalintegration.com>
Reini Urban <rurban@sbox.tu-graz.ac.at>
Rex Dieter <rdieter@math.unl.edu>
Rich Morin <rdm@cfcl.com>
## Toplevel Makefile for cross-compilation of perl
#
-## $Id: Makefile,v 1.3 2003/05/27 21:23:19 red Exp red $
+## $Id: Makefile,v 1.4 2003/09/05 00:48:19 red Exp red $
export TOPDIR?=${shell pwd}
include $(TOPDIR)/config
@echo Optimizations: $(FULL_OPTIMIZATION)
$(TOPDIR)/generate_config_sh config.sh-$(SYS) > $(TOPDIR)/../config.sh
- $(TOPDIR)/generate_config_sh config.sh-$(SYS) > $(TOPDIR)/../config.sh-arse
cd $(TOPDIR)/.. ; ./Configure -S ; make depend ; make ; make more
cd $(TOPDIR)/.. ; mkdir -p fake_config_library ; cp lib/Config.pm fake_config_library
cd $(TOPDIR)/.. ; $(MAKE) more2 "PERLRUN=/usr/bin/perl -I$(TOPDIR)/../fake_config_library -MConfig"
---- ../Makefile.SH 2003-04-22 14:13:52.000000000 +0000
-+++ Makefile.SH 2003-05-27 21:07:07.000000000 +0000
-@@ -104,16 +104,17 @@
-
- case "$osname" in
- linux)
+--- ../Makefile.SH 2003-08-22 09:49:04.000000000 -0500
++++ Makefile.SH 2003-09-05 02:38:40.000000000 -0500
+@@ -110,18 +110,7 @@
+ # INSTALL file, under "Building a shared perl library".
+ # If there is no pre-existing $libperl, we don't need
+ # to do anything further.
+- if test -f $archlib/CORE/$libperl; then
- rm -f preload
-- cat <<-'EOT' > preload
-- #! /bin/sh
-- lib=$1
-- shift
-- test -r $lib && export LD_PRELOAD="$lib $LD_PRELOAD"
-- exec "$@"
-- EOT
+- cat <<'EOT' > preload
+-#! /bin/sh
+-lib=$1
+-shift
+-test -r $lib && export LD_PRELOAD="$lib $LD_PRELOAD"
+-exec "$@"
+-EOT
- chmod 755 preload
- ldlibpth="$ldlibpth `pwd`/preload `pwd`/$libperl"
-+# rm -f preload
-+# cat <<-'EOT' > preload
-+# #! /bin/sh
-+# lib=$1
-+# shift
-+# test -r $lib && export LD_PRELOAD="$lib $LD_PRELOAD"
-+# exec "$@"
-+# EOT
-+# chmod 755 preload
-+# ldlibpth="$ldlibpth `pwd`/preload `pwd`/$libperl"
-+ echo linux libraries overridden my cross-compile patches
- ;;
+- fi
++ echo linux libraries overwritten by cross-compile patches
+ ;;
os390) test -f /bin/env && ldlibpth="/bin/env $ldlibpth"
;;
-@@ -343,9 +344,20 @@
+@@ -349,9 +338,21 @@
.c.s:
$(CCCMDSRC) -S $*.c
+#all: $(FIRSTMAKEFILE) miniperl$(EXE_EXT) extra.pods $(private) $(public) $(dynamic_ext) $(nonxs_ext) extras.make
+# @echo " ";
+# @echo " Everything is up to date. Type '$(MAKE) test' to run test suite."
++
+all: $(FIRSTMAKEFILE) miniperl$(EXE_EXT)
+ mv miniperl miniperl-arm
+ ln -s /usr/bin/perl miniperl
+
+more3: $(nonxs_ext)
+
-+more4: extras.make
++more4: extras.make
.PHONY: all compile translators utilities
-@@ -355,10 +367,10 @@
+@@ -361,10 +362,10 @@
cd x2p; $(MAKE) compile;
cd pod; $(MAKE) compile;
@echo " "; echo " Making utilities"; cd utils; $(LDLIBPTH) $(MAKE) all
-@@ -535,7 +547,7 @@
+@@ -541,7 +542,7 @@
$(CC) -o miniperl $(CLDFLAGS) \
`echo $(obj) | sed 's/ op$(OBJ_EXT) / /'` \
miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) perl$(OBJ_EXT) $(libs)
!NO!SUBS!
;;
beos*|next4*)
-@@ -552,7 +564,7 @@
- -@rm -f miniperl.xok
- $(CC) $(CLDFLAGS) -o miniperl \
- miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
+@@ -549,7 +550,7 @@
+ miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
+ $(CC) -o miniperl `echo $(obj) | sed 's/ op$(OBJ_EXT) / /'` \
+ miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) perl$(OBJ_EXT) $(libs)
- $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
+# $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
!NO!SUBS!
;;
- esac
-@@ -678,7 +690,7 @@
+ darwin*)
+@@ -716,7 +717,7 @@
# We need to autosplit in two steps because VOS can't handle so many args
#
.PHONY: preplibrary
@sh ./makedir lib/auto
@echo " AutoSplitting perl library"
$(LDLIBPTH) ./miniperl -Ilib -e 'use AutoSplit; \
-@@ -690,11 +702,11 @@
+@@ -728,11 +729,11 @@
# Take care to avoid modifying lib/Config.pm without reason
# (If trying to create a new port and having problems with the configpm script,
# try 'make minitest' and/or commenting out the tests at the end of configpm.)
$(LDLIBPTH) ./miniperl minimod.pl > minimod.tmp
sh mv-if-diff minimod.tmp $@
-touch lib/ExtUtils/Miniperl.pm
-@@ -702,18 +714,18 @@
+@@ -740,18 +741,18 @@
lib/re.pm: ext/re/re.pm
cp ext/re/re.pm ext/re/re.tmp && sh mv-if-diff ext/re/re.tmp lib/re.pm
$(LDLIBPTH) ./miniperl -Ilib lib/lib_pm.PL
-extra.pods: miniperl$(EXE_EXT)
-+extra.pods:
++extra.pods:
-@test -f extra.pods && rm -f `cat extra.pods`
-@rm -f extra.pods
-@for x in `grep -l '^=[a-z]' README.* | grep -v README.vms` ; do \
-@@ -752,18 +764,10 @@
+@@ -793,18 +794,7 @@
$(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-n
install.perl: all installperl
- cd ../pod; $(MAKE) compile; \
- else :; \
- fi
-- $(LDLIBPTH) ./perl installperl $(INSTALLFLAGS) $(STRIPFLAGS)
+- $(LDLIBPTH) ./perl installperl --destdir=$(DESTDIR) $(INSTALLFLAGS) $(STRIPFLAGS)
- $(MAKE) extras.install
-+ /usr/bin/perl -Ifake_config_library -MConfig installperl $(INSTALLFLAGS) $(STRIPFLAGS)
-
+-
-install.man: all installman
-- $(LDLIBPTH) ./perl installman $(INSTALLFLAGS)
-+install.man: installman
-+ /usr/bin/perl -Ifake_config_library -MConfig installman $(INSTALLFLAGS)
+- $(LDLIBPTH) ./perl installman --destdir=$(DESTDIR) $(INSTALLFLAGS)
++ /usr/bin/perl -Ifake_config_library -MConfig installperl $(INSTALLFLAGS) $(STRIPFLAGS)
# XXX Experimental. Hardwired values, but useful for testing.
# Eventually Configure could ask for some of these values.
-@@ -870,16 +874,16 @@
+@@ -920,16 +910,16 @@
#
# DynaLoader may be needed for extensions that use Makefile.PL.
@$(LDLIBPTH) sh ext/util/make_ext $(STATIC) $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
-n_dummy $(nonxs_ext): miniperl$(EXE_EXT) preplibrary $(DYNALOADER) FORCE
-+n_dummy $(nonxs_ext): preplibrary $(DYNALOADER) FORCE
++n_dummy $(nonxs_ext): preplibrary $(DYNALOADER) FORCE
@$(LDLIBPTH) sh ext/util/make_ext nonxs $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
.PHONY: clean _tidy _mopup _cleaner1 _cleaner2 \
-@@ -1019,7 +1023,7 @@
+@@ -1069,7 +1059,7 @@
test_prep_pre: preplibrary utilities $(nonxs_ext)
PERL=./perl $(MAKE) _test_prep
_test_tty:
-@@ -1088,7 +1092,7 @@
+@@ -1157,7 +1147,7 @@
# Can't depend on lib/Config.pm because that might be where miniperl
# is crashing.
-Summary
--------
+Building for arm-linux
+----------------------
-This is a patch set which adds cross-compilation to the perl
-buildsystem. It was built as a part of the Open Zaurus
-(http://www.openzaurus.com/) distribution. Most / All of the
-arm compiler optimisations are "borrowed" from this excellent
-project.
+The files in this directory add another cross-compilation
+target to the Perl buildsystem. It was built as a part of
+the Open Zaurus (http://www.openzaurus.com/) distribution.
+Most / All of the arm compiler optimisations are "borrowed"
+from this excellent project.
The main target is arm-linux but I have also managed to
-successfully cross-compile perl for solaris x86 using the same
+successfully cross-compile Perl for Solaris x86 using the same
buildsystem.
We are currently dependent on an existing working local copy of
-perl ** of the same version and revision ** which is available
-as /usr/bin/perl. This could be migrated to using native
-miniperl with some additional effort.
+Perl ** of the same version and revision ** which is available
+as /usr/bin/perl.
-Obviously you need a working and tested cross-compiler for your
-build and target combination. The binary directory must be in
+You need a working and tested cross-compiler for your build
+and target combination. The binary directory must be in
your path.
-1) You should be reading me (README) in perl-5.x.x/Cross
+1) You should be reading me (README) in perl-5.8.1/Cross
2) Make sure you are in the Cross directory.
4) make patch ## This will patch the existing source-tree.
5) make perl ## Will make perl
+Your built Perl environment is in install_me_here/ in your build
+directory. From here you can package and deploy as you wish.
+
The Obvious Ommissions
----------------------
-This does NOT perform any installation as site installation method will
-be dependant on the target arch and OS.
+This does NOT perform any installation as site installation method
+will be dependent on the target architecture and OS.
-make test will NOT work as the binaries and libraries will not execute.
+make test will NOT work as the binaries and libraries will not execute
+on your BUILD machine.
Due to space limitations on the Zaurus (it's a PDA) we do not provide
documentation in the core - Therefore man pages are not even generated.
+Other Targets (For Developers)
+------------------------------
+
+It is possible to extend the cross-compilation to other targets.
+We have sucessfully compiled for the target solaris2.8/x86
+on linux/x86 build system.
+
+To attempt a cross-compile for another target using the methods
+in this directory:
+
+1) Copy the Perl source code onto your TARGET machine.
+2) Execute sh Configure as normal and configure as required,
+ do not "make".
+3) Copy the config.sh file that is generated to your BUILD
+ machine and place it in the Cross directory with the
+ filename config.sh-ARCH-OS. For example,
+ config.sh-i386-pc-solaris2.8. For the appropriate ARCH
+ and OS please refer to your cross-compiler documentation.
+4) Edit Cross/config to reflect your new target and continue
+ with build as above.
+
+Should you wish to produce optimised binaries for different
+architectures you can add the appropriate compiler flags to
+the Makefile in a new ifeq ($(ARCH),...) ... endif block.
+
+Please refer to your cross-compiler documentation for details.
+
+
Note that the Cross/ directory is also used by a different
cross-compilation setup described in the INSTALL file, and
executed by Configure. There should be no conflicts since
-Install man pages.
Provide a better sandbox for building additional XS libraries.
# do not forget to propagate your changes by running "Configure -der". You may
# instead choose to run each of the .SH files by yourself, or "Configure -S".
#
-# $Id: config.sh-arm-linux,v 1.2 2003/05/27 21:31:15 red Exp red $
-#
# Package name : perl5
# Source directory : .
-# Configuration time: Sat Mar 8 00:20:33 UTC 2003
-# Configured by : root
-# Target system : linux zaurus 2.4.6-rmk1-np2-embedix #5 wed dec 11 22:20:32 cst 2002 armv4l unknown
+# Configuration time: Wed Sep 3 22:24:58 EDT 2003
+# Configured by : red
+# Target system : linux openzaurus.criticalintegration.com 2.4.6-rmk1-np2-embedix #15 Wed Aug 6 07:49:44 UTC 2003 armv4l unknown
-Author='Redvers Davies <red@criticalintegration.com>'
+Author=''
Date='$Date'
Header=''
Id='$Id'
ansi2knr=''
aphostname='/bin/hostname'
api_revision='5'
-api_subversion='1'
+api_subversion='0'
api_version='8'
-api_versionstring='5.8.1'
-ar='arm-linux-ar'
+api_versionstring='5.8.0'
+ar='ar'
archlib='/usr/lib/perl5/5.8.1/armv4l-linux'
archlibexp='/usr/lib/perl5/5.8.1/armv4l-linux'
archname64=''
c=''
castflags='0'
cat='cat'
-cc='arm-linux-gcc'
-cccdlflags=''
-ccdlflags=''
-ccflags='-fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
+cc='cc'
+cccdlflags='-fpic'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.8.1/armv4l-linux/CORE'
+ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
-ccname='arm-linux-gcc'
-ccsymbols='__APCS_32__=1 __ARM_ARCH_4__=1 __CHAR_UNSIGNED__=1 __GNUC_MINOR__=95 __arm=1 __arm__=1 __arm_elf=1 __arm_elf__=1 __linux=1 __linux__=1 __unix=1 __unix__=1 arm=1 arm_elf=1 cpu=arm machine=arm system=posix system=unix'
+ccname='gcc'
+ccsymbols='__APCS_32__=1 __ARM_ARCH_3__=1 __CHAR_UNSIGNED__=1 __GNUC_MINOR__=95 __arm__=1 __linux=1 __linux__=1 __unix=1 __unix__=1 cpu=arm machine=arm system=posix system=unix'
ccversion=''
-cf_by='root'
+cf_by='red'
cf_email='red@criticalintegration.com'
-cf_time='Sat Mar 8 00:20:33 UTC 2003'
+cf_time='Wed Sep 3 22:24:58 EDT 2003'
charsize='1'
chgrp=''
chmod='chmod'
contains='grep'
cp='cp'
cpio=''
-cpp='arm-linux-cpp'
+cpp='cpp'
cpp_stuff='42'
cppccsymbols='__ELF__=1 __GNUC__=2 linux=1 unix=1'
-cppflags='-fno-strict-aliasing'
+cppflags='-fno-strict-aliasing -I/usr/local/include'
cpplast='-'
cppminus='-'
-cpprun='arm-linux-gcc -E'
-cppstdin='arm-linux-gcc -E'
+cpprun='cc -E'
+cppstdin='cc -E'
cppsymbols='_FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC_MINOR__=95 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 __linux=1 __linux__=1 __unix=1 __unix__=1'
crypt_r_proto='0'
cryptlib=''
d_cmsghdr_s='define'
d_const='define'
d_copysignl='define'
-d_crypt='undef'
+d_crypt='define'
d_crypt_r='undef'
-d_csh='undef'
+d_csh='define'
d_ctermid_r='undef'
d_ctime_r='undef'
d_cuserid='define'
d_difftime='define'
d_dirfd='define'
d_dirnamlen='undef'
-d_dlerror='undef'
-d_dlopen='undef'
+d_dlerror='define'
+d_dlopen='define'
d_dlsymun='undef'
d_dosuid='undef'
d_drand48_r='undef'
d_fchmod='define'
d_fchown='define'
d_fcntl='define'
-d_fcntl_can_lock='undef'
+d_fcntl_can_lock='define'
d_fd_macros='define'
d_fd_set='define'
d_fds_bits='undef'
d_mkstemps='undef'
d_mktime='define'
d_mmap='define'
-d_modfl='undef'
-d_modflproto='undef'
+d_modfl='define'
d_modfl_pow32_bug='undef'
+d_modflproto='undef'
d_mprotect='define'
d_msg='define'
d_msg_ctrunc='define'
d_pipe='define'
d_poll='define'
d_portable='define'
-d_procselfexe='undef'
+d_procselfexe='define'
d_pthread_atfork='undef'
+d_pthread_attr_setscope='define'
d_pthread_yield='undef'
d_pwage='undef'
d_pwchange='undef'
d_socklen_t='define'
d_sockpair='define'
d_socks5_init='undef'
-d_sqrtl='undef'
+d_sqrtl='define'
d_srand48_r='undef'
d_srandom_r='undef'
d_sresgproto='undef'
d_truncate='define'
d_ttyname_r='undef'
d_tzname='define'
-d_u32align='define'
+d_u32align='undef'
d_ualarm='define'
d_umask='define'
d_uname='define'
doublesize='8'
drand01='drand48()'
drand48_r_proto='0'
-dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize attrs re threads threads/shared Encode/Byte Encode/CN Encode/EBCDIC Encode/JP Encode/KR Encode/Symbol Encode/TW Encode/Unicode Errno Filter/Util/Call'
+dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize attrs re threads threads/shared Encode/Byte Encode/CN Encode/EBCDIC Encode/JP Encode/KR Encode/Symbol Encode/TW Encode/Unicode Errno'
+extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared Errno'
extras=''
fflushNULL='define'
fflushall='undef'
fpostype='fpos_t'
freetype='void'
from=':'
-full_ar='/usr/local/arm/2.95.3/bin/arm-linux-ar'
-full_csh='csh'
+full_ar='/usr/bin/ar'
+full_csh='/bin/csh'
full_sed='/bin/sed'
gccansipedantic=''
gccosandvers=''
-gccversion='2.95.1 19990816 (release)'
+gccversion='2.95.3 20010125 (prerelease)'
getgrent_r_proto='0'
getgrgid_r_proto='0'
getgrnam_r_proto='0'
glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib /usr/ucblib /usr/local/lib '
gmake='gmake'
gmtime_r_proto='0'
-gnulibc_version='2.2.4'
+gnulibc_version='2.2.2'
grep='grep'
groupcat='cat /etc/group'
groupstype='gid_t'
inews=''
installarchlib='./install_me_here/usr/lib/perl5/5.8.1/armv4l-linux'
installbin='./install_me_here/usr/bin'
-installman1dir=''
-installman3dir=''
-installprefix='./install_me_here/usr/lib/perl5'
-installprefixexp='./install_me_here/usr/lib/perl5'
+installhtml1dir=''
+installhtml3dir=''
+installman1dir='./install_me_here/usr/share/man/man1'
+installman3dir='./install_me_here/usr/share/man/man3'
+installprefix='./install_me_here/usr'
+installprefixexp='./install_me_here/usr'
installprivlib='./install_me_here/usr/lib/perl5/5.8.1'
installscript='./install_me_here/usr/bin'
installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.8.1/armv4l-linux'
installsitebin='./install_me_here/usr/bin'
-installsitehtml1=''
-installsitehtml3=''
+installsitehtml1dir=''
+installsitehtml3dir=''
installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.8.1'
-installstyle='lib/perl5'
+installsiteman1dir='./install_me_here/usr/share/man/man1'
+installsiteman3dir='./install_me_here/usr/share/man/man3'
+installsitescript='./install_me_here/usr/bin'
+installstyle='./install_me_herelib/perl5'
installusrbinperl='undef'
installvendorarch=''
installvendorbin=''
+installvendorhtml1dir=''
+installvendorhtml3dir=''
installvendorlib=''
+installvendorman1dir=''
+installvendorman3dir=''
+installvendorscript=''
intsize='4'
issymlink='/usr/bin/test -h'
ivdformat='"ld"'
ivtype='long'
known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
ksh=''
-ld='arm-linux-ld'
-lddlflags=' -shared '
-ldflags=''
+ld='cc'
+lddlflags='-shared -L/usr/local/lib'
+ldflags=' -L/usr/local/lib'
ldflags_uselargefiles=''
ldlibpthname='LD_LIBRARY_PATH'
less='less'
lib_ext='.a'
-libc='/lib/libc-2.2.4.so'
+libc='/lib/libc-2.2.2.so'
libperl='libperl.so'
-libpth='/lib /usr/lib'
-libs='-lc -lm -ldl'
-libsdirs=' /lib'
-libsfiles=' libc.so'
-libsfound=' /lib/libc.so'
-libspath=' /lib /usr/lib'
-libswanted='sfio socket bind inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m c cposix posix ndir dir crypt sec ucb BSD PW x util'
+libpth='/usr/local/lib /lib /usr/lib'
+libs='-lnsl -ldl -lm -lcrypt -lutil -lc'
+libsdirs=' /usr/lib'
+libsfiles=' libnsl.so libdl.so libm.so libcrypt.so libutil.so libc.so'
+libsfound=' /usr/lib/libnsl.so /usr/lib/libdl.so /usr/lib/libm.so /usr/lib/libcrypt.so /usr/lib/libutil.so /usr/lib/libc.so'
+libspath=' /usr/local/lib /lib /usr/lib'
+libswanted='sfio socket bind inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m crypt sec util c cposix posix ucb BSD'
libswanted_uselargefiles=''
line=''
lint=''
mallocobj=''
mallocsrc=''
malloctype='void *'
-man1dir=' '
-man1direxp=''
-man1ext='0'
-man3dir=' '
-man3direxp=''
-man3ext='0'
+man1dir='/usr/share/man/man1'
+man1direxp='/usr/share/man/man1'
+man1ext='1'
+man3dir='/usr/share/man/man3'
+man3direxp='/usr/share/man/man3'
+man3ext='3'
mips_type=''
+mistrustnm=''
mkdir='mkdir'
mmaptype='void *'
modetype='mode_t'
mv=''
myarchname='armv4l-linux'
mydomain='.criticalintegration.com'
-myhostname='citalopram'
-myuname='linux zaurus 2.4.6-rmk1-np2-embedix #5 wed dec 11 22:20:32 cst 2002 armv4l unknown '
+myhostname='openzaurus'
+myuname='linux openzaurus.criticalintegration.com 2.4.6-rmk1-np2-embedix #15 Wed Aug 6 07:49:44 UTC 2003 armv4l unknown '
n='-n'
need_va_copy='undef'
netdb_hlen_type='size_t'
netdb_net_type='in_addr_t'
nm='nm'
nm_opt=''
-nm_so_opt=''
+nm_so_opt='--dynamic'
nonxs_ext='Errno'
nroff='nroff'
nvEUformat='"E"'
passcat='cat /etc/passwd'
patchlevel='8'
path_sep=':'
-perl5=''
+perl5='/usr/bin/perl'
perl=''
perl_patchlevel=''
perladmin='red@criticalintegration.com'
-perllibs='-lc -lm -ldl'
+perllibs='-lnsl -ldl -lm -lcrypt -lutil -lc'
perlpath='/usr/bin/perl'
pg='pg'
phostname='hostname'
prefixexp='/usr'
privlib='/usr/lib/perl5/5.8.1'
privlibexp='/usr/lib/perl5/5.8.1'
-procselfexe=''
+procselfexe='"/proc/self/exe"'
prototype='define'
ptrsize='4'
quadkind='3'
randfunc='drand48'
random_r_proto='0'
randseedtype='long'
-ranlib='/usr/bin/ranlib'
+ranlib=':'
rd_nodata='-1'
readdir64_r_proto='0'
readdir_r_proto='0'
shortsize='2'
shrpenv=''
shsharp='true'
-sig_count='1'
-sig_name='ZERO '
-sig_name_init='"ZERO", 0'
-sig_num='0 '
-sig_num_init='0, 0'
-sig_size='1'
+sig_count='64'
+sig_name='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS RTMIN NUM33 NUM34 NUM35 NUM36 NUM37 NUM38 NUM39 NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 NUM48 NUM49 NUM50 NUM51 NUM52 NUM53 NUM54 NUM55 NUM56 NUM57 NUM58 NUM59 NUM60 NUM61 NUM62 RTMAX IOT CLD POLL UNUSED '
+sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "SYS", "RTMIN", "NUM33", "NUM34", "NUM35", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41", "NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "NUM48", "NUM49", "NUM50", "NUM51", "NUM52", "NUM53", "NUM54", "NUM55", "NUM56", "NUM57", "NUM58", "NUM59", "NUM60", "NUM61", "NUM62", "RTMAX", "IOT", "CLD", "POLL", "UNUSED", 0'
+sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 6 17 29 31 '
+sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0'
+sig_size='68'
signal_t='void'
sitearch='/usr/lib/perl5/site_perl/5.8.1/armv4l-linux'
sitearchexp='/usr/lib/perl5/site_perl/5.8.1/armv4l-linux'
sitebin='/usr/bin'
sitebinexp='/usr/bin'
-sitehtml1=' '
-sitehtml1exp=''
-sitehtml3=' '
-sitehtml3exp=''
+sitehtml1dir=''
+sitehtml1direxp=''
+sitehtml3dir=''
+sitehtml3direxp=''
sitelib='/usr/lib/perl5/site_perl/5.8.1'
sitelib_stem='/usr/lib/perl5/site_perl'
sitelibexp='/usr/lib/perl5/site_perl/5.8.1'
-siteprefix='/usr/lib/perl5.8.1'
+siteman1dir='/usr/share/man/man1'
+siteman1direxp='/usr/share/man/man1'
+siteman3dir='/usr/share/man/man3'
+siteman3direxp='/usr/share/man/man3'
+siteprefix='/usr'
siteprefixexp='/usr'
+sitescript='/usr/bin'
+sitescriptexp='/usr/bin'
sizesize='4'
sizetype='size_t'
sleep=''
strerror_r_proto='0'
strings='/usr/include/string.h'
submit=''
-subversion='0'
-sysman='/usr/man/man1'
+subversion='1'
+sysman='/usr/share/man/man1'
tail=''
tar=''
targetarch=''
use64bitall='undef'
use64bitint='undef'
usecrosscompile='undef'
-usedl='undef'
-usefaststdio='undef'
+usedl='define'
+usefaststdio='define'
useithreads='undef'
uselargefiles='define'
uselongdouble='undef'
vendorarchexp=''
vendorbin=''
vendorbinexp=''
+vendorhtml1dir=' '
+vendorhtml1direxp=''
+vendorhtml3dir=' '
+vendorhtml3direxp=''
vendorlib=''
vendorlib_stem=''
vendorlibexp=''
+vendorman1dir=' '
+vendorman1direxp=''
+vendorman3dir=' '
+vendorman3direxp=''
vendorprefix=''
vendorprefixexp=''
+vendorscript=''
+vendorscriptexp=''
version='5.8.1'
-version_patchlevel_string='version 8 subversion 1 patchlevl 19636'
+version_patchlevel_string='version 8 subversion 1'
versiononly='undef'
vi=''
voidflags='15'
zcat=''
zip='zip'
# Configure command line arguments.
-config_arg0='./Configure'
-config_args='-Dprefix=/usr/local/perl5.8.1 -Uinstallusrbinperl -des'
-config_argc=3
-config_arg1='-Dprefix=/usr/local/perl5.8.1'
-config_arg2='-Uinstallusrbinperl'
-config_arg3='-des'
+config_arg0='Configure'
+config_args=''
+config_argc=0
PERL_REVISION=5
PERL_VERSION=8
PERL_SUBVERSION=1
PERL_API_REVISION=5
PERL_API_VERSION=8
-PERL_API_SUBVERSION=1
-PERL_PATCHLEVEL=0
+PERL_API_SUBVERSION=0
+PERL_PATCHLEVEL=
PERL_CONFIG_SH=true
##############################################################################
#
-# Ok, so there is this buildsystem that has variables set in shell
-# like this:
+# generate_config_sh
+# Process that takes an automatically generated config.sh
+# file and allows the environment to overload the values
+# automatically discovered by Configure on our target platform.
#
-# cc='gcc'
-#
-# This means we can go
-#
-# if test "${AR+set}" != set; then
-# ar='arm-linux-ar'
-# else
-# ar=${AR}
-# fi
-#
-# Right??? WRONG!
-#
-# Damn perl installation *PARSES* and *PATTERN MATCHES* this file.
+# Author Redvers Davies <red@criticalintegration.com>
#
##############################################################################
---- ../installperl 2003-03-26 21:07:13.000000000 +0000
-+++ installperl 2003-05-01 11:17:48.000000000 +0000
+--- ../installperl 2003-08-31 11:58:48.000000000 -0500
++++ installperl 2003-09-05 02:38:40.000000000 -0500
@@ -3,8 +3,8 @@
BEGIN {
require 5.004;
}
use strict;
-@@ -878,7 +878,7 @@
+@@ -931,7 +931,7 @@
print " " if (@opts);
print "$file\n";
}
lib/overload.pm Module for overloading perl operators
lib/overload.t See if operator overloading works
lib/perl5db.pl Perl debugging routines
+lib/perl5db/de0.t Testing debugger commands
+lib/perl5db/dumpvar.t Testing the dumper used by the debugger
lib/PerlIO.pm PerlIO support module
lib/PerlIO/via/QuotedPrint.pm PerlIO::via::QuotedPrint
lib/PerlIO/via/t/QuotedPrint.t PerlIO::via::QuotedPrint
lib/Unicode/Collate/keys.txt Unicode::Collate
lib/Unicode/Collate.pm Unicode::Collate
lib/Unicode/Collate/README Unicode::Collate
+lib/Unicode/Collate/t/contract.t Unicode::Collate
lib/Unicode/Collate/t/hangul.t Unicode::Collate
lib/Unicode/Collate/t/index.t Unicode::Collate
lib/Unicode/Collate/t/test.t Unicode::Collate
+2.006 - 8th September 2003
+
+ * call_(pv|sv|method|argv) added
+ * still compiler-warnings for grok_??? and 5.6.x, fixed
+
2.005 - 2nd September 2003
* Some tweaks to grok_(hex|oct|bin) to make compiler warnings
aTHX_
AvFILLp
boolSV(b)
+ call_argv
+ call_method
+ call_pv
+ call_sv
DEFSV
dMY_CXT
dMY_CXT_SV
use strict;
use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK $data );
-$VERSION = "2.005";
+$VERSION = "2.006";
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw();
# define get_hv(name,create) perl_get_hv(name,create)
#endif
+#ifndef call_argv
+# define call_argv perl_call_argv
+#endif
+
+#ifndef call_method
+# define call_method perl_call_method
+#endif
+
+#ifndef call_pv
+# define call_pv perl_call_pv
+#endif
+
+#ifndef call_sv
+# define call_sv perl_call_sv
+#endif
+
#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
#endif
# define PERL_SCAN_DISALLOW_PREFIX 0x02
#endif
-#if (PERL_VERSION > 6)
+#if (PERL_VERSION >= 6)
#define I32_CAST
#else
#define I32_CAST (I32*)
PERL_UNUSED_DECL
dNOOP
+call_argv
+call_method
+call_pv
+call_sv
+
get_cv
get_av
get_hv
use 5.003_11;
use strict;
-$Safe::VERSION = "2.09";
+$Safe::VERSION = "2.10";
+
+# *** Don't declare any lexicals above this point ***
+#
+# This function should return a closure which contains an eval that can't
+# see any lexicals in scope (apart from __ExPr__ which is unavoidable)
+
+sub lexless_anon_sub {
+ # $_[0] is package;
+ # $_[1] is strict flag;
+ my $__ExPr__ = $_[2]; # must be a lexical to create the closure that
+ # can be used to pass the value into the safe
+ # world
+
+ # Create anon sub ref in root of compartment.
+ # Uses a closure (on $__ExPr__) to pass in the code to be executed.
+ # (eval on one line to keep line numbers as expected by caller)
+ eval sprintf
+ 'package %s; %s strict; sub { @_=(); eval q[my $__ExPr__;] . $__ExPr__; }',
+ $_[0], $_[1] ? 'use' : 'no';
+}
use Carp;
my ($obj, $expr, $strict) = @_;
my $root = $obj->{Root};
- # Create anon sub ref in root of compartment.
- # Uses a closure (on $expr) to pass in the code to be executed.
- # (eval on one line to keep line numbers as expected by caller)
- my $evalcode = sprintf('package %s; sub { @_ = (); eval $expr; }', $root);
- my $evalsub;
-
- if ($strict) { use strict; $evalsub = eval $evalcode; }
- else { no strict; $evalsub = eval $evalcode; }
-
+ my $evalsub = lexless_anon_sub($root,$strict, $expr);
return Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub);
}
=head1 NAME
-PerlIO::scalar - support module for in-memory IO.
+PerlIO::scalar - in-memory IO, scalar IO
=head1 SYNOPSIS
- open($fh,"<",\$scalar);
- open($fh,">",\$scalar);
+ my $scalar = '';
+ ...
+ open my $fh, "<", \$scalar or die;
+ open my $fh, ">", \$scalar or die;
+ open my $fh, ">>", \$scalar or die;
or
- open($fh,"<:scalar",\$scalar);
- open($fh,">:scalar",\$scalar);
+ my $scalar = '';
+ ...
+ open my $fh, "<:scalar", \$scalar or die;
+ open my $fh, ">:scalar", \$scalar or die;
+ open my $fh, ">>:scalar", \$scalar or die;
=head1 DESCRIPTION
-C<PerlIO::scalar> only exists to use XSLoader to load C code that provides
-support for treating a scalar as an "in memory" file.
+A filehandle is opened but the file operations are performed "in-memory"
+on a scalar variable. All the normal file operations can be performed
+on the handle. The scalar is considered a stream of bytes. Currently
+fileno($fh) returns C<undef>.
-All normal file operations can be performed on the handle. The scalar
-is considered a stream of bytes. Currently fileno($fh) returns C<undef>.
-
-=cut
+=head1 IMPLEMENTATION NOTE
+C<PerlIO::scalar> only exists to use XSLoader to load C code that
+provides support for treating a scalar as an "in memory" file.
+One does not need to explicitly C<use PerlIO::scalar>.
+=cut
* or the _name_ of the scalar
*/
if (arg) {
- if (SvROK(arg)) {
+ if (SvROK(arg) && SvTYPE(SvRV(arg)) > SVt_NULL) {
s->var = SvREFCNT_inc(SvRV(arg));
if (!SvPOK(s->var))
(void)SvPV_nolen(s->var);
}
$| = 1;
-print "1..24\n";
+print "1..25\n";
my $fh;
my $var = "ok 2\n";
{ package P; sub TIESCALAR {bless{}} sub FETCH {"ok 24\n"} }
tie $p, P; open $fh, '<', \$p;
print <$fh>;
+
+# don't warn when writing to an undefined scalar
+
+{
+ use warnings;
+ my $ok = 1;
+ local $SIG{__WARN__} = sub { $ok = 0; };
+ open my $fh, '>', \my $scalar;
+ print $fh "foo";
+ close $fh;
+ print $ok ? "ok 25\n" : "not ok 25\n";
+}
+Sat Sep 6 01:08:20 IST 2003 Abhijit Menon-Sen <ams@wiw.org>
+
+ Version 2.08
+
+ This release works around a 5.8.0 bug which caused hashes to not
+ be marked as having key flags even though an HEK had HEK_WASUTF8
+ set. (Note that the only reasonable solution is to silently drop
+ the flag from the affected key.)
+
+ Users of RT 3 who were seeing assertion failures should upgrade.
+ (Perl 5.8.1 will have the bug fixed.)
+
Mon May 5 10:24:16 IST 2003 Abhijit Menon-Sen <ams@wiw.org>
Version 2.07
#define STORABLE_BIN_WRITE_MINOR 6
#endif /* (PATCHLEVEL <= 6) */
+#if (PATCHLEVEL <= 8 || (PATCHLEVEL == 8 && SUBVERSION < 1))
+#define PL_sv_placeholder PL_sv_undef
+#endif
+
/*
* Useful store shortcuts...
*/
PUTMARK(flags);
TRACEME(("(#%d) key '%s' flags %x %u", i, keyval, flags, *keyval));
} else {
- assert (flags == 0);
+ /* This is a workaround for a bug in 5.8.0
+ that causes the HEK_WASUTF8 flag to be
+ set on an HEK without the hash being
+ marked as having key flags. We just
+ cross our fingers and drop the flag.
+ AMS 20030901 */
+ assert (flags == 0 || flags == SHV_K_WASUTF8);
TRACEME(("(#%d) key '%s'", i, keyval));
}
WLEN(keylen);
PUTMARK(flags);
TRACEME(("(#%d) key '%s' flags %x", i, key, flags));
} else {
- assert (flags == 0);
+ /* This is a workaround for a bug in 5.8.0
+ that causes the HEK_WASUTF8 flag to be
+ set on an HEK without the hash being
+ marked as having key flags. We just
+ cross our fingers and drop the flag.
+ AMS 20030901 */
+ assert (flags == 0 || flags == SHV_K_WASUTF8);
TRACEME(("(#%d) key '%s'", i, key));
}
if (flags & SHV_K_ISSV) {
thaw $frozen; # used to segfault here
ok 19, 1;
-$a = []; $#$a = 2; $a->[1] = undef;
-$b = thaw freeze $a;
-@a = map { ~~ exists $a->[$_] } 0 .. $#$a;
-@b = map { ~~ exists $b->[$_] } 0 .. $#$b;
-ok 20, "@a" eq "@b";
+if ($] >= 5.006) {
+ eval '
+ $a = []; $#$a = 2; $a->[1] = undef;
+ $b = thaw freeze $a;
+ @a = map { ~~ exists $a->[$_] } 0 .. $#$a;
+ @b = map { ~~ exists $b->[$_] } 0 .. $#$b;
+ ok 20, "@a" eq "@b";
+ ';
+}
+else {
+ print "ok 20 # skipped (no av_exists)\n";
+}
# present in files, but not in things store()ed to memory
$fancy = ($] > 5.007 ? 2 : 0);
-plan tests => 368 + length ($byteorder) * 4 + $fancy * 8;
+plan tests => 368 + length ($byteorder) * 4 + $fancy * 8 + 1;
use Storable qw (store retrieve freeze thaw nstore nfreeze);
# And now try almost everything again with a Storable string
$stored = nfreeze \%hash;
test_things($stored, \&freeze_and_thaw, 'string', 1);
+
+# Test that the bug fixed by #20587 doesn't affect us under some older
+# Perl. AMS 20030901
+{
+ chop(my $a = chr(0xDF).chr(256));
+ my %a = (chr(0xDF) => 1);
+ $a{$a}++;
+ freeze \%a;
+ # If we were built with -DDEBUGGING, the assert() should have killed
+ # us, which will probably alert the user that something went wrong.
+ ok(1);
+}
if ($ENV{PERL_CORE}){
chdir('t') if -d 't';
@INC = ('.', '../lib');
- use vars qw($MacPerl::Architecture);
- push @INC, "::lib:$MacPerl::Architecture:" if $^O eq 'MacOS';
+ if ($^O eq 'MacOS') {
+ # Look, I'm using this fully-qualified variable more than once!
+ my $arch = $MacPerl::Architecture;
+ push @INC, "::lib:${MacPerl::Architecture}:";
+ }
} else {
unshift @INC, 't';
}
use Sys::Syslog qw(:DEFAULT setlogsock); # default set, plus setlogsock
setlogsock $sock_type;
- openlog $ident, $logopt, $facility;
+ openlog $ident, $logopt, $facility; # don't forget this
syslog $priority, $format, @args;
$oldmask = setlogmask $mask_priority;
closelog;
more of the words I<pid>, I<ndelay>, I<nowait>. The cons option is
ignored, since the failover mechanism will drop down to the console
automatically if all other media fail. I<$facility> specifies the
-part of the system
+part of the system to report about, for example LOG_USER or LOG_LOCAL0:
+see your C<syslog(3)> documentation for the facilities available in
+your system.
+
+B<You should use openlog() before calling syslog().>
=item syslog $priority, $format, @args
printed as by C<printf(3V)>, with the addition that I<%m>
is replaced with C<"$!"> (the latest error message).
+If you didn't use openlog() before using syslog(), syslog will try to
+guess the I<$ident> by extracting the shortest prefix of I<$format>
+that ends in a ":".
+
=item setlogmask $mask_priority
Sets log mask I<$mask_priority> and returns the old mask.
require Exporter;
-our $VERSION = '0.27';
+our $VERSION = '0.28';
our $PACKAGE = __PACKAGE__;
our @ISA = qw(Exporter);
# A coderef to get combining class imported from Unicode::Normalize
# (i.e. \&Unicode::Normalize::getCombinClass).
# This is also used as a HAS_UNICODE_NORMALIZE flag.
-our $getCombinClass;
+our $CVgetCombinClass;
# Supported Levels
use constant MinLevel => 1;
croak "Unicode/Normalize.pm is required to normalize strings: $@"
if $@;
- $getCombinClass = \&Unicode::Normalize::getCombinClass
- if ! $getCombinClass;
+ $CVgetCombinClass = \&Unicode::Normalize::getCombinClass
+ if ! $CVgetCombinClass;
- my $norm = $self->{normalization};
- $self->{normCode} = sub {
+ if ($self->{normalization} ne 'prenormalized') {
+ my $norm = $self->{normalization};
+ $self->{normCode} = sub {
Unicode::Normalize::normalize($norm, shift);
};
-
- eval { $self->{normCode}->("") }; # try
- if ($@) {
- croak "$PACKAGE unknown normalization form name: $norm";
+ eval { $self->{normCode}->("") }; # try
+ $@ and croak "$PACKAGE unknown normalization form name: $norm";
}
}
return;
if ! exists $self->{overrideHangul};
$self->{overrideCJK} = ''
if ! exists $self->{overrideCJK};
- $self->{normalization} = 'D'
+ $self->{normalization} = 'NFD'
if ! exists $self->{normalization};
$self->{alternate} = $self->{alternateTable} || 'shifted'
if ! exists $self->{alternate};
$i = $p;
}
}
- }
- # with Combining Char (UTS#10, 4.2.1).
- # requires Unicode::Normalize.
- # Not be $wLen, as not croaked due to $norm.
- if ($getCombinClass) {
- for (my $p = $i + 1; $p < @src; $p++) {
- next if ! defined $src[$p];
- last unless $getCombinClass->($src[$p]);
- my $tail = CODE_SEP . $src[$p];
- if ($ent->{$ce.$tail}) {
- $ce .= $tail;
- $src[$p] = undef;
+ # not-contiguous contraction with Combining Char (cf. UTS#10, S2.1).
+ # This process requires Unicode::Normalize.
+ # If "normalize" is undef, here should be skipped *always*
+ # (in spite of bool value of $CVgetCombinClass),
+ # since canonical ordering cannot be expected.
+ # Blocked combining character should not be contracted.
+
+ if ($self->{normalization})
+ # $self->{normCode} is false in the case of "prenormalized".
+ {
+ my $preCC = 0;
+ my $curCC = 0;
+
+ for (my $p = $i + 1; $p < @src; $p++) {
+ next if ! defined $src[$p];
+ $curCC = $CVgetCombinClass->($src[$p]);
+ last unless $curCC;
+ my $tail = CODE_SEP . $src[$p];
+ if ($preCC != $curCC && $ent->{$ce.$tail}) {
+ $ce .= $tail;
+ $src[$p] = undef;
+ } else {
+ $preCC = $curCC;
+ }
}
}
}
A form name C<Unicode::Normalize::normalize()> accepts will be applied
as C<$normalization_form>.
+Acceptable names include C<'NFD'>, C<'NFC'>, C<'NFKD'>, and C<'NFKC'>.
See C<Unicode::Normalize::normalize()> for detail.
If omitted, C<'NFD'> is used.
L<normalization> is performed after L<preprocess> (if defined).
-If C<undef> is passed explicitly as the value for this key,
+Furthermore, special values, C<undef> and C<"prenormalized">, can be used,
+though they are not concerned with C<Unicode::Normalize::normalize()>.
+
+If C<undef> (not a string C<"undef">) is passed explicitly
+as the value for this key,
any normalization is not carried out (this may make tailoring easier
if any normalization is not desired).
-
-see B<CAVEAT>.
+Under C<(normalization =E<gt> undef)>, only contiguous contractions
+are resolved; e.g. C<A-cedilla-ring> would be primary equal to C<A>,
+even if C<A-ring> (and C<A-ring-cedilla>) is ordered after C<Z>.
+In this point,
+C<(normalization =E<gt> undef, preprocess =E<gt> sub { NFD(shift) })>
+B<is not> equivalent to C<(normalization =E<gt> 'NFD')>.
+
+In the case of C<(normalization =E<gt> "prenormalized")>,
+any normalization is not performed, but
+non-contiguous contractions with combining characters are performed.
+Therefore
+C<(normalization =E<gt> 'prenormalized', preprocess =E<gt> sub { NFD(shift) })>
+B<is> equivalent to C<(normalization =E<gt> 'NFD')>.
+If source strings are finely prenormalized,
+C<(normalization =E<gt> 'prenormalized')> may save time for normalization.
+
+Except C<(normalization =E<gt> undef)>,
+B<Unicode::Normalize> is required (see also B<CAVEAT>).
=item overrideCJK
Revision history for Perl module Unicode::Collate.
+0.28 Sat Sep 06 20:16:01 2003
+ - Fixed another inconsistency under (normalization => undef):
+ Non-contiguous contraction is always neglected.
+ - Fixed: according to S2.1 in UTS #10, a blocked combining character
+ should not be contracted. One test in test.t was wrong, then removed.
+ - Added contract.t.
+ - (normalization => "prenormalized") is able to be used.
+
0.27 Sun Aug 31 22:23:17 2003
some improvements:
- - The maximum length of contracted CE was not checked.
+ - The maximum length of contracted CE was not checked (v0.22 to v0.26).
Collation of a large string including a first letter of a contraction
that is not a part of that contraction (say, 'c' of 'ca'
where 'ch' is defined) was too slow, inefficient.
-Unicode/Collate version 0.27
+Unicode/Collate version 0.28
===============================
NAME
--- /dev/null
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 40 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+use vars qw($IsEBCDIC);
+$IsEBCDIC = ord("A") != 0x41;
+
+our $kjeEntry = <<'ENTRIES';
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
+043A ; [.0D31.0020.0002.043A] # CYRILLIC SMALL LETTER KA
+041A ; [.0D31.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
+045C ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0301 ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+040C ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0301 ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+ENTRIES
+
+our $aaEntry = <<'ENTRIES';
+0304 ; [.0000.005A.0002.0304] # COMBINING MACRON (cc = 230)
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE (cc = 230)
+0327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA (cc = 202)
+031A ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE (cc = 232)
+0061 ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
+0041 ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
+007A ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
+005A ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
+00E5 ; [.0C25.0020.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.0C25.0020.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+0061 030A ; [.0C25.0020.0002.0061] # LATIN SMALL LETTER A WITH RING ABOVE
+0041 030A ; [.0C25.0020.0008.0041] # LATIN CAPITAL LETTER A WITH RING ABOVE
+ENTRIES
+
+#########################
+
+ok(1); # If we made it this far, we're ok.
+
+my $kjeNoN = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => undef,
+ entry => $kjeEntry,
+);
+
+ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
+ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
+
+our %sortkeys;
+
+$sortkeys{'KAac'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}");
+$sortkeys{'KAta'} = $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}");
+$sortkeys{'KAat'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}");
+
+eval { require Unicode::Normalize };
+if (!$@ && !$IsEBCDIC) {
+ my $kjeNFD = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ entry => $kjeEntry,
+ );
+ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0301}"));
+ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
+
+ my $aaNFD = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ entry => $aaEntry,
+ );
+
+ok($aaNFD->lt("Z", "A\x{30A}\x{304}"));
+ok($aaNFD->eq("A", "A\x{304}\x{30A}"));
+ok($aaNFD->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
+ok($aaNFD->eq("A\x{304}", "A\x{304}\x{30A}"));
+ok($aaNFD->lt("Z", "A\x{327}\x{30A}"));
+ok($aaNFD->lt("Z", "A\x{30A}\x{327}"));
+ok($aaNFD->lt("Z", "A\x{31A}\x{30A}"));
+ok($aaNFD->lt("Z", "A\x{30A}\x{31A}"));
+
+ my $aaPre = Unicode::Collate->new(
+ level => 1,
+ normalization => "prenormalized",
+ table => undef,
+ entry => $aaEntry,
+ );
+
+ok($aaPre->lt("Z", "A\x{30A}\x{304}"));
+ok($aaPre->eq("A", "A\x{304}\x{30A}"));
+ok($aaPre->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
+ok($aaPre->eq("A\x{304}", "A\x{304}\x{30A}"));
+ok($aaPre->lt("Z", "A\x{327}\x{30A}"));
+ok($aaPre->lt("Z", "A\x{30A}\x{327}"));
+ok($aaPre->lt("Z", "A\x{31A}\x{30A}"));
+ok($aaPre->lt("Z", "A\x{30A}\x{31A}"));
+}
+else {
+ ok(1) for 1..20;
+}
+
+# again: loading Unicode::Normalize should not affect $kjeNoN.
+ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
+ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
+
+ok($sortkeys{'KAac'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}"));
+ok($sortkeys{'KAta'}, $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}"));
+ok($sortkeys{'KAat'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}"));
+
+my $aaNoN = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ entry => $aaEntry,
+ normalization => undef,
+);
+
+ok($aaNoN->lt("Z", "A\x{30A}\x{304}"));
+ok($aaNoN->eq("A", "A\x{304}\x{30A}"));
+ok($aaNoN->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
+ok($aaNoN->eq("A\x{304}", "A\x{304}\x{30A}"));
+ok($aaNoN->eq("A", "A\x{327}\x{30A}"));
+ok($aaNoN->lt("Z", "A\x{30A}\x{327}"));
+ok($aaNoN->eq("A", "A\x{31A}\x{30A}"));
+ok($aaNoN->lt("Z", "A\x{30A}\x{31A}"));
+
}
use Test;
-BEGIN { plan tests => 199 };
+BEGIN { plan tests => 200 };
use strict;
use warnings;
if (!$@ && !$IsEBCDIC) {
my $NFD = Unicode::Collate->new(
- table => undef,
+ table => 'keys.txt',
+ level => 1,
entry => <<'ENTRIES',
0430 ; [.0CB5.0020.0002.0430] # CYRILLIC SMALL LETTER A
0410 ; [.0CB5.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
ok($NFD->eq("\x{4D3}\x{325}", "\x{430}\x{308}\x{325}"));
ok($NFD->lt("\x{430}\x{308}A", "\x{430}\x{308}B"));
ok($NFD->lt("\x{430}\x{3099}B", "\x{430}\x{308}\x{3099}A"));
- ok($NFD->eq("\x{0430}\x{3099}\x{309A}\x{0308}",
- "\x{0430}\x{309A}\x{3099}\x{0308}") );
}
else {
ok(1);
ok(1);
ok(1);
- ok(1);
}
##############
table => 'keys.txt',
normalization => undef,
ignoreName => qr/HANGUL|HIRAGANA|KATAKANA|BOPOMOFO/,
- level => 4,
+ level => 3,
entry => << 'ENTRIES',
0063 0068 ; [.0A3F.0020.0002.0063] % "ch" in traditional Spanish
0043 0068 ; [.0A3F.0020.0008.0043] # "Ch" in traditional Spanish
);
ok($trad->eq("ocho", "oc\cAho")); # UCA v9
ok($trad->eq("ocho", "oc\0\cA\0\cBho")); # UCA v9
+ok($trad->eq("-", "")); # also UCA v8
+ok($trad->lt("oc-ho", "ocho")); # also UCA v8
my $hiragana = "\x{3042}\x{3044}";
my $katakana = "\x{30A2}\x{30A4}";
--- /dev/null
+#!./perl -- -*- mode: cperl; cperl-indent-level: 4 -*-
+
+BEGIN {
+ require Config; import Config;
+ if (!$Config{'d_fork'}
+ # open2/3 supported on win32 (but not Borland due to CRT bugs)
+ && (($^O ne 'MSWin32' && $^O ne 'NetWare') || $Config{'cc'} =~ /^bcc/i))
+ {
+ print "1..0\n";
+ exit 0;
+ }
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $ENV{PERL5LIB} = '../lib'; # so children will see it too
+}
+
+use strict;
+use IPC::Open3 qw(open3);
+use IO::Select;
+
+$|=1;
+
+my @prgs;
+
+{
+ local $/;
+ @prgs = split "########\n", <DATA>;
+ close DATA;
+}
+
+use Test::More;
+
+plan tests => scalar @prgs;
+
+require "dumpvar.pl";
+
+$ENV{PERLDB_OPTS} = "TTY=0";
+my($ornament1,$ornament2,$wtrfh,$rdrfh);
+open3 $wtrfh, $rdrfh, 0, $^X, "-de0";
+my $ios = IO::Select->new();
+$ios->add($rdrfh);
+for (@prgs){
+ my($prog,$expected) = split(/\nEXPECT\n?/, $_);
+ print $wtrfh $prog, "\n";
+ my $got;
+ while (not defined $got) {
+ while ($ios->can_read(0.25)) {
+ sysread $rdrfh, $got, 1024, length($got);
+ }
+ }
+ $got =~ s/^\s*Loading.*\nEditor.*\n\nEnter.*\n\nmain::\(-e:1\):\s0\n//;
+ unless (defined $ornament1) {
+ $got =~ s/^\s*Loading.*\nEditor.*\n\nEnter.*\n\nmain::\(-e:1\):\s0\n//;
+ ($ornament1,$ornament2) = $got =~
+ /(.*?)0\s+'reserved example for calibrating the ornaments'\n(.*)/
+ }
+ $got =~ s/^\Q$ornament1\E//;
+ $got =~ s/\Q$ornament2\E\z//;
+ like($got, qr:$expected:i, $prog);
+}
+
+__END__
+x "reserved example for calibrating the ornaments"
+EXPECT
+0 'reserved example for calibrating the ornaments'
+########
+x "foo"
+EXPECT
+0 'foo'
+########
+x "\x{100}"
+EXPECT
+0 '\\x\{0100\}'
+########
+x *a
+EXPECT
+0 \*main::a
+########
+x 1..3
+EXPECT
+0 1
+1 2
+2 3
+########
+x +{1..4}
+EXPECT
+0\s+HASH\(0x[0-9a-f]+\)
+\s+1 => 2
+\s+3 => 4
+########
--- /dev/null
+#!./perl -- -*- mode: cperl; cperl-indent-level: 4 -*-
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ unless (find PerlIO::Layer 'perlio') { # PerlIO::scalar
+ print "1..0 # Skip: not perlio\n";
+ exit 0;
+ }
+}
+
+use strict;
+
+$|=1;
+
+my @prgs;
+{
+ local $/;
+ @prgs = split "########\n", <DATA>;
+ close DATA;
+}
+
+use Test::More;
+
+plan tests => scalar @prgs;
+
+require "dumpvar.pl";
+
+sub unctrl { print dumpvar::unctrl($_[0]), "\n" }
+sub uniescape { print dumpvar::uniescape($_[0]), "\n" }
+sub stringify { print dumpvar::stringify($_[0]), "\n" }
+
+package Foo;
+
+sub new { my $class = shift; bless [ @_ ], $class }
+
+package Bar;
+
+sub new { my $class = shift; bless [ @_ ], $class }
+
+use overload '""' => sub { "Bar<@{$_[0]}>" };
+
+package main;
+
+my $foo = Foo->new(1..5);
+my $bar = Bar->new(1..5);
+
+for (@prgs) {
+ my($prog, $expected) = split(/\nEXPECT\n?/, $_);
+ # TODO: dumpvar::stringify() is controlled by a pile of package
+ # dumpvar variables: $printUndef, $unctrl, $quoteHighBit, $bareStringify,
+ # and so forth. We need to test with various settings of those.
+ open my $select, ">", \my $got or die;
+ select $select;
+ eval $prog;
+ my $ERR = $@;
+ close $select;
+ select STDOUT;
+ if ($ERR) {
+ ok(0, "$prog - $ERR");
+ } else {
+ if ($expected =~ m:^/:) {
+ like($got, $expected, $prog);
+ } else {
+ is($got, $expected, $prog);
+ }
+ }
+}
+
+__END__
+unctrl("A");
+EXPECT
+A
+########
+unctrl("\cA");
+EXPECT
+^A
+########
+uniescape("A");
+EXPECT
+A
+########
+uniescape("\x{100}");
+EXPECT
+\x{0100}
+########
+stringify(undef);
+EXPECT
+undef
+########
+stringify("foo");
+EXPECT
+'foo'
+########
+stringify("\cA");
+EXPECT
+"\cA"
+########
+stringify(*a);
+EXPECT
+*main::a
+########
+stringify(\undef);
+EXPECT
+/^'SCALAR\(0x[0-9a-f]+\)'$/i
+########
+stringify([]);
+EXPECT
+/^'ARRAY\(0x[0-9a-f]+\)'$/i
+########
+stringify({});
+EXPECT
+/^'HASH\(0x[0-9a-f]+\)'$/i
+########
+stringify(sub{});
+EXPECT
+/^'CODE\(0x[0-9a-f]+\)'$/i
+########
+stringify(\*a);
+EXPECT
+/^'GLOB\(0x[0-9a-f]+\)'$/i
+########
+stringify($foo);
+EXPECT
+/^'Foo=ARRAY\(0x[0-9a-f]+\)'$/i
+########
+stringify($bar);
+EXPECT
+/^'Bar=ARRAY\(0x[0-9a-f]+\)'$/i
+########
+dumpValue(undef);
+EXPECT
+undef
+########
+dumpValue(1);
+EXPECT
+1
+########
+dumpValue("\cA");
+EXPECT
+"\cA"
+########
+dumpValue("\x{100}");
+EXPECT
+'\x{0100}'
+########
+dumpValue("1\n2\n3");
+EXPECT
+'1
+2
+3'
+########
+dumpValue([1..3],1);
+EXPECT
+0 1
+1 2
+2 3
+########
+dumpValue({1..4},1);
+EXPECT
+1 => 2
+3 => 4
+########
+dumpValue($foo,1);
+EXPECT
+0 1
+1 2
+2 3
+3 4
+4 5
+########
+dumpValue($bar,1);
+EXPECT
+0 1
+1 2
+2 3
+3 4
+4 5
+########